技术专题
OA系统身份证号码的正则表达式及验证详解(JavaScript,Regex)
2020-02-25 17:22:25

最近在OA系统在做用户实名验证,身份证号码的有效性预先验证就是必须的,以便于提醒用户输入错误,当然真正的实名验证,必须是后台验证。本文是以javascrtip为例使用正则表达式及校验为前端验证。


居民身份证号码,正确、正式的称谓应该是“公民身份号码”。根据【中华人民共和国国家标准 GB 11643-1999】中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

需要做的校验
校验长度、地址码、生日、最后一位校验码,

下面我们就从零开始完成一个完整的身份证号码校验过程。

我们分步做如下规则定义:
 


    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按gb/T2260的规定执行。
    地址码长6位
    以数字1-9开头
    后5位为0-9的数字
    前两位为省级代码

根据以上规则,写出地址码的正则表达式: /^[1-9][0-9]\d{5}/
 

    年份码长4位
    以数字18,19或20开头
    剩余两位为0-9的数字

根据以上规则,写出年份码的正则表达式: /18|19|20)[0-9]\d{2}/。如果不需要18开头的年份,可以去掉18。
但是这样写必定会遭遇千年bug,因此完全用正则表达式是不够的。

 


    需考闰年平年,大月小月问题
    月份码长2位
    第一位数字为0,第二位数字为1-9
    或者第一位数字为1,第二位数字为0-2
    平年
    1,3,5,7,8,10,12大月
    2,4,6,8,11小月
    
    日期码长2位
    第一位数字为0-2,第二位数字为1-9
    或者是10,20,30,31,29
    
   根据以上规则
   写出闰年日期码的正则表达式 : /((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]))/。

   写出平年日期码的正则表达式 :/((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]))

 


表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
    顺序码长3位
    顺序码是数字

根据以上规则,写出顺序码的正则表达式 :/\d{3}/。

 


作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么 此人的身份证就变成了19位。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
    校验码长1位
    可以是数字,字母x或字母X

根据以上规则,写出校验码的正则表达式 :/[0-9Xx]/。

 

综合以上5条规则,给出完整的正则表达式如下:

     闰年ereg = /^[1-9][0-9]\d{5}(18|19|20)[0-9]\d{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]\d{3}[0-9X]$/; //闰年出生日期的合法性正则表达式
     平年ereg = /^[1-9][0-9]\d{5}(18|19|20)[0-9]\d{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]\d{3}[0-9X]$/; //平年出生日期的合法性正则表达式

 


根据身份证主体码(前17位)分别与对应的加权因子计算乘积再求和,根据所得结果与11取模得到X值。
根据 X 值查询校验位,得出校验码值。

加权因子
factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
校验位
parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];

 

点这里下载

 


本javascript身份证号码验证是在前端进行身份证一般规则格式的校验,只是为了检查用户在手动输入时的错误,并不能避免机器或人工输入伪身份证号,存在百年bug,最多只能到在1800年到2099年。真正的校验必须在后端进行,查询身份证库,并进行人脸识别。