在项目中通过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();
}
}
效果图如下: