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 相关文章推荐
jquery 3D球状导航的文章分类
Jul 06 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
Feb 27 Javascript
js判断ie版本号的简单实现代码
Mar 05 Javascript
JavaScript验证知识整理
Mar 24 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
利用Three.js如何实现阴影效果实例代码
Sep 26 Javascript
Three.js如何实现雾化效果示例代码
Sep 27 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
vue-cli3搭建项目的详细步骤
Dec 05 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
Feb 15 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正则提取图片地址
2014/03/27 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
使用Python进行目录的对比方法
2018/11/01 Python
python set内置函数的具体使用
2019/07/02 Python
Python hmac模块使用实例解析
2019/12/24 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
Django REST framwork的权限验证实例
2020/04/02 Python
Python排序函数的使用方法详解
2020/12/11 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
党的群众路线学习材料
2014/05/16 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书