项目中用js隐藏身份证信息

在项目中通过js来隐藏身份证的某些字符,电脑版的实现是在页面截取,现在做手机版,想把截取字符串放在后台来操作,但为了保证手机版和电脑版显示一致,所以希望截取规则也能一致,ftl页面的js写法如下:

<html>
<body>

<script type="text/javascript">

var html = '123456789abcdefghi';
var uw = html.replace(/(\w)/g,function(a,b,c,d){return ((c>1&&c<6)||c>(html.length-5))?'*':a});
document.write (uw);//打印出来的字符串 12****789abcde**** 

</script>
</body>
</html>

replace替换的正则表达式 /(\w)/g 中:
\w表示 用于匹配字母、数字、下划线字符 (但是我看有篇文章写的是如果里面的a是俄语的话,就可以逃过验证)
g表示是否全局替换,非全局的只替换首个匹配的字符串。
function(a,b,c,d)分别表示的意思是:
匹配到的字符串、变量值、匹配到的字符串在原字符串中的位置(从0开始)、原字符串

========================
对于function(a,b,c,d)js参数从哪里来的呢?
在网上搜了半天,发现是个官方定义的参数含义。对于参数的测试结果截图如下:
这里写图片描述


下面是用java代码替换在js中隐藏的实现,第一种方法源码如下:

package com.evan.string;

public class JS2JAVAExpression {

    public static void main(String[] args) {
        // var uw = html.replace(/(\w)/g,function(a,b,c,d){return ((c>1&&c<6)||c>(html.length-5))?'*':a}); 
        /* 
         * 在线电脑版证件号码隐藏的规则: 对于身份证,会把第三位到第六位和最后四位替换成*号
         * 对于非身份证,会把从第四位开始替换成*号,如果证件号长度小于等于3会完全显示。
         * 
         * 下面的代码是为了模拟实现js中格式化身份证的实现
         */

        String html = "123456789abcdefghi";
        int cardType = 01;//01表示身份证类型 其他表示非身份证类型
        StringBuffer sb = new StringBuffer();
        if (01 == cardType) {
            String three2six = html.substring(2, 6);// 截取第3-6位字符串
            for (int i = 0; i < three2six.length(); i++) {
                sb.append("*");
            }
            html = html.replace(three2six, sb.toString());
            String fourEnd = html.substring(html.length() - 4, html.length());
            sb.delete(0, sb.length());
            for (int i = 0; i < fourEnd.length(); i++) {
                sb.append("*");
            }
            html = html.replace(fourEnd, sb.toString());
        } else {
            if (html.length() > 3) {
                String endStr = html.substring(3, html.length());
                System.out.println(endStr);

                for (int i = 0; i < endStr.length(); i++) {
                    sb.append("*");
                }
                html = html.replace(endStr, sb.toString());
            }
        }
        System.out.println(html);
    }
}

虽然上面的代码可以实现对于身份证的截取和js截取效果类似,但是假设身份证长度出现小于6(正常一般不会),会出现数组下标越界的问题。而且不是真正的模拟js中的实现。
下面是真正用java模拟js隐藏身份证的实现,而且我项目中也是这样用。具体源码如下:

package com.ciming.book.mobile.util;

public class SubIdCard {

    public static void main(String[] args) {

        String html = "123456789abcdefghi";

        int cardType = 01;//在项目中是动态得到
        StringBuffer sb = new StringBuffer();
        if (01 == cardType) {
            String new_idCard = idCardHide(html);
            System.out.println(new_idCard);
        } else {
            if (html.length() > 3) {
                String endStr = html.substring(3, html.length());
                System.out.println(endStr);

                for (int i = 0; i < endStr.length(); i++) {
                    sb.append("*");
                }
                html = html.replace(endStr, sb.toString());
            }
        }
        System.out.println(html);
    }

    public static String idCardHide(String s) {
        String a;
        String b;
        int c;
        String d = s;

        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            c = i;
            a = b = String.valueOf(ch[i]);
            if ((c > 1 && c < 6) || c > ch.length - 5) {
                ch[i] = '*';
            }
        }
        StringBuffer sb = new StringBuffer();

        for (char c1 : ch) {
            sb.append(c1);
        }
        return sb.toString();
    }
}

效果图如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值