JS身份证信息验证正则表达式


Posted in Javascript onJune 12, 2017

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

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前端身份证信息验证正则表达式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript之文件操作
Mar 07 Javascript
DOM2非标准但却支持很好的几个属性小结
Jan 21 Javascript
javascript之Partial Application学习
Jan 10 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
jquery获得option的值和对option进行操作
Dec 13 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
vue router导航守卫(router.beforeEach())的使用详解
Apr 19 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
Jun 25 Javascript
用原生JS实现简单的多选框功能
Jun 12 #Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
Jun 12 #Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
Jun 12 #Javascript
AngularJS 异步解决实现方法
Jun 12 #Javascript
jquery+css实现侧边导航栏效果
Jun 12 #jQuery
angularjs实现上拉加载和下拉刷新数据功能
Jun 12 #Javascript
Vue非父子组件通信详解
Jun 12 #Javascript
You might like
php实现微信企业转账功能
2018/10/02 PHP
javascript函数中的arguments参数
2010/08/01 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
JS实现页面打印功能
2017/03/16 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
Python中数字以及算数运算符的相关使用
2015/10/12 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
zookeeper python接口实例详解
2018/01/18 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
实习求职信
2013/12/01 职场文书
自行车广告词大全
2014/03/21 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
python获取字符串中的email
2022/03/31 Python