很多时候我们都是通过一组正则表达式来判断用户输入的身份证是否合法,那在用正则表达式判断之前,首先要做到的是对身份证信息的一些效验规则的知晓:

1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码(前六位数)
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按gb/T2260的规定执行。
3、出生日期码(第七位至十四位)
表示编码对象出生的年、月、日,按gb/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码(第十五位至十七位)
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码(第十八位数)
作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么 此人的身份证就变成了19位。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
然后开始进入正题:
第一步,编写报错规则:
var Errors = new Array("验证通过!", "身份证号码位数不对!", "身份证号码出生日期超出范围或含有非法字符!", "身份证号码校验错误!", "身份证地区非法!");
第二步,定义一个全国匹配的对象:
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: "国外"
}
第三步,定义分别定义15位身份证和18位身份中的效验规则:
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-9][0-9]{5}19[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}$/; //测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}19[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[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
}
if (ereg.test(idcard)) {
return Errors[0];
}
else {
return Errors[2];
}
break;
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 = /^[1-9][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]$/; //闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][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[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式
}
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); //判断校验位
if (M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
} else return Errors[2];
break;
default:
return Errors[1];
break;
}
最终版本:
function checkId(idcard) {
var Errors = new Array("验证通过!", "身份证号码位数不对!", "身份证号码出生日期超出范围或含有非法字符!", "身份证号码校验错误!", "身份证地区非法!");
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: "国外"
}
var retflag = false;
var idcard, Y, JYM;
var S, M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区检验
if (area[parseInt(idcard.substr(0, 2))] == null) return Errors[4];
//身份号码位数及格式检验
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-9][0-9]{5}19[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}$/; //测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}19[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[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
}
if (ereg.test(idcard)) {
return Errors[0];
}
else {
return Errors[2];
}
break;
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 = /^[1-9][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]$/; //闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][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[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式
}
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); //判断校验位
if (M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
} else return Errors[2];
break;
default:
return Errors[1];
break;
}
};
最后直接调用方法就行了,回返回校验结果。
以上所述是小编给大家介绍的JS前端身份证信息验证正则表达式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# js身份证验证正则表达式
# 15/18位身份证号码验证的正则表达式总结(详细版)
# JavaScript正则表达式验证身份证号码是否合法(两种方法)
# JS使用正则表达式验证身份证号码
# 最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
# JS正则表达式完美实现身份证校验功能
# JS正则表达式详解及身份证号码验证(简易版)
# 如何用javascript正则表达式验证身份证号码是否合法
# JS常见简单正则表达式验证功能小结【手机
# 地址
# 企业税号
# 金额
# 身份证等】
# 正则表达式校验身份证号码完整代码示例
# 出生日期
# 身份证号码
# 正则表达式
# 校验位
# 校验码
# 青海
# 西藏
# 宁夏
# 内蒙古
# 甘肃
# 贵州
# 黑龙江
# 吉林
# 海南
# 山西
# 新疆
# 陕西
# 辽宁
# 湖北
# 广西
相关文章:
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
网站制作需要会哪些技术,建立一个网站要花费多少?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
清除minerd进程的简单方法
如何快速上传建站程序避免常见错误?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
建站之星下载版如何获取与安装?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
建站之星如何通过成品分离优化网站效率?
威客平台建站流程解析:高效搭建教程与设计优化方案
如何在腾讯云服务器快速搭建个人网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站主机数据库如何配置才能提升网站性能?
C#如何在一个XML文件中查找并替换文本内容
独立制作一个网站多少钱,建立网站需要花多少钱?
招商网站制作流程,网站招商广告语?
如何用y主机助手快速搭建网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何用免费手机建站系统零基础打造专业网站?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何快速生成橙子建站落地页链接?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
如何快速搭建高效WAP手机网站吸引移动用户?
建站主机与服务器功能差异如何区分?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何选择适合PHP云建站的开源框架?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何快速选择适合个人网站的云服务器配置?
如何配置IIS站点权限与局域网访问?
h5网站制作工具有哪些,h5页面制作工具有哪些?
如何制作算命网站,怎么注册算命网站?
如何快速搭建自助建站会员专属系统?
如何通过西部建站助手安装IIS服务器?
专业网站建设制作报价,网页设计制作要考什么证?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何正确选择百度移动适配建站域名?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
建站之星3.0如何解决常见操作问题?
教程网站设计制作软件,怎么创建自己的一个网站?
如何注册花生壳免费域名并搭建个人网站?
建站之星导航菜单设置与功能模块配置全攻略
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
中山网站制作网页,中山新生登记系统登记流程?
如何彻底卸载建站之星软件?
如何在云主机上快速搭建多站点网站?
建站之星安装提示数据库无法连接如何解决?
*请认真填写需求信息,我们会在24小时内与您取得联系。