用正则表达式验证身份证号
开发工具与关键技术:VS MVC
作者:彭春怡
撰写时间:2019/6/4
在现在的信息时代,个人的信息真假难辨,但身份证号就是唯一的,也正因如此我们的信息录入都离不开身份证的使用。有了身份证的广泛使用,同时验证身份证号码的知识也被广泛应用,而我现在要说的就是用正则表达式验证身份证号码。
在这里我会以一个包含新增身份证号的信息内容来作为案例,来简单说明其原理
首先在已经建好的新增数据的弹出层样式中获取身份证号input标签对应的ID
//新增身份证验证
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲IsStudentIDNum"…("#IsStudentIDNum").val());
接着就是调用封装好的验证身份证号的方法
将从页面获取的身份证号值经行验证,若idCard等于false则提示:身份证有误,请检查!
if (idCard == false) {
layer.msg(“身份证有误,请检查!”);
}
});
这只是身份证验证的使用方法,接下来的是这个方法idCardNo
jquery 验证身份证合法性的js
会分别对15和18位的身份证号进行验证,非常严格。
- @param value 身份证号
function idCardNo(value) {
//验证身份证号方法
var area = { 11: “北京”, 12: “天津”, 13: “河北”, 14: “山西”, 15: “内蒙古”, 21: “辽宁”, 22: “吉林”, 23: “黑龙江”, 31: “上海”, 32: “江苏”, 33: “浙江”, 34: “安徽”, 35: “福建”, 36: “江西”, 37: “山东”, 41: “河南”, 42: “湖北”, 43: “湖南”, 44: “广东”, 45: “广西”, 46: “海南”, 50: “重庆”, 51: “四川”, 52: “贵州”, 53: “云南”, 54: “西藏”, 61: “陕西”, 62: “甘肃”, 63: “青海”, 64: “宁夏”, 65: “新疆”, 71: “台湾”, 81: “香港”, 82: “澳门”, 91: “国外” }
首先是声明这个数组,并确定身份证开头的两个数字代表的所在地,11开头的身份证所在地在北京,12则为天津,广东为44等等。
var idcard, Y, JYM;
var idcard = value;
var S, M;
var idcard_array = new Array();
idcard_array = idcard.split("");
截取身份证号,判断是否为空,为空则返回false,
当身份证号为15位数时用switch case语句判断身份证号其的合法性,
测试出生日期的合法性
if (area[parseInt(idcard.substr(0, 2))] == null) return false;
switch (idcard.length) {
case 15:
if ((parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(idcard.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0)) {
ereg = /1[0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}KaTeX parse error: Expected 'EOF', got '}' at position 17: …; }̲ el…/;
}
如果身份证号符合正则表达式的验证则返回true,否则返回false
if (ereg.test(idcard))
//return Errors[0];
var res = true;
else
//return Errors[2];
var res = false;
return res;
break;
跳出循环
因为我们中国的年月是分闰年和平年的,所以当身份证号为18位数时验证时也会分开验证,用if else语句判断截取的数据除于4等于零,或许截取的数据除于100等于零和截取的数据除于4等于零,再用正则表达式判断闰年出生日期的合法性,else则用平年出生日期的合法性正则表达式判断。首先是用if else语句来判断 闰年出生日期的合法性正则表达式,else则为平年出生日期的合法性正则表达式
case 18:
if (parseInt(idcard.substr(6, 4)) % 4 == 0 || (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6, 4)) % 4 == 0)) {
ereg = /2[0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]KaTeX parse error: Expected 'EOF', got '}' at position 20: …/ }̲ else { …/; /
}
接着再获取已经通过正则表达式判断的数据,再将通过下面的方法验证,获取其下标为零的数组加上下标为10的数组乘7再加上下标为1的数子和下标为11的数字和再乘9,接着加上下标为2的和下标为12的数字乘以10,接下的以此类推,得出S值.
if (ereg.test(idcard)) {
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3;
Y = S % 11;
M = “F”;
JYM = “10X98765432”;
M = JYM.substr(Y, 1);
如果M== idcard_array[17]则为true,否则else ,var res = false;
跳出循环。
if (M == idcard_array[17])
//return Errors[0];
var res = true;
else
//return Errors[3];
var res = false;
}
else
//return Errors[2];
res = false;
return res;
break;
default:
res = false;
return res;
break;
};
}
就这样子身份证验证就此完成了, 有不对的地方,请指教,谢谢。