在验证用户的真实姓名时,经常使用正则表达式和身份证号码验证方案。 本文列出了两种验证方案。 您可以根据您项目的实际情况选择合适的方案。
身份证号码说明
身份证号码的正确正式名称应为“公民身份证号码”。 根据中华人民共和国国家标准GB 11643-1999中关于公民身份号码的规定,公民身份号码是特征组合码,由十七位本体码和一位校验码组成。 从左到右:六位地址码、八位出生日期代码、三位序列码和一位位校验码。
以北京市朝阳区一名女性的身份证号为例。 ID号的含义如下图:
注:ID号来源于国家标准[GB 11643-1999]。
接下来我们将从头开始完成一个完整的身份证号验证流程。
选项 1(简单)
1.1 划分规则
1.1.1 地址码规则:地址码长度为6位,最后5位为0-9位。
根据上述规则,写出地址码的正则表达式:/[1-9]\d{5}/
1.1.2年份代码规则:年份代码长度为4位,以数字18、19或20开始,其余两位为0-9。
根据上述规则,写出年份代码的正则表达式:/(18|19|20)\d{2}/。 如果不需要18开头的年份,可以删除18。
1.1.3 月份代码规则:月份代码长度第一位为0第二位为1-9或第一位为1第二位为0-2
根据上述规则,写出月份代码的正则表达式:/((0[1-9])|(1[0-2])/。
1.1.4 日期编码规则:日期编码第一位为0-2,第二位为1-9或10、20、30、31
根据上述规则,写出日期代码的正则表达式:/(([0-2][1-9])|10|20|30|31)/。
1.1.5 序列号规则: 序列号长度为3位。
根据上述规则,写出序列码的正则表达式:/\d{3}/。
1.1.6 校验码规则: 校验码长度的一位数字可以是数字、字母x或字母x。
根据上述规则,写出校验码的正则表达式:/[0-9Xx]/。
1.2 方案一正则表达式
基于以上6个规则,完整的正则表达式和测试程序如下:
风险值 p=/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([ 0-2][1-9])|10|20|30|31)\d{3}[0-9xx]$/; //输出真。 log(p . test(' x '); // 输出 false . log(p . test(' x '); //输出 . log(p . test(' x ')), false 年份不能以 17 开头; //输出 false 月份不能是 13. log (p . test(' x '); //输出 false 日期不能是 32. log(p . test(' x '); // false 不能以 . log(p.test('a'); 1.3 方案1分析
该方案仅确定了基本格式,但存在三个主要缺点:地址码确定不够准确。 例如,中国没有16或26开头的地区,但通过验证日期可以判断不准确。 例:也能通过验证,但2月没有31天校验码,是用17位本体码计算的。 选项 1 不验证代码。 方案二(综合) 针对方案一的不足,针对方案一的不足,引入方案二。
2.1 省份地址代码验证
华北地区:北京11、天津12、河北13、山西14、内蒙古15 东北地区:辽宁21、吉林22、黑龙江23 华东地区:上海31、江苏32、浙江33、安徽34、福建35、江西36、山东37 华中地区:河南 41、湖北 42、湖南 43 华南地区:广东 44、广西 45
根据地址码,验证身份证号码的前两位,进一步提高准确性。 现行地址代码以2013年版行政区划代码[GB/T2260]为基础。 由于分区代码的历史演变,地址代码的最后四位数字无法检查。 以三胖的身份证号为例。 我的身份证号是2321开头的,但是现在的行政区划代码表里没有这个代码。 因此,本文仅验证前两个省级地址码。
还有一种说法是91开头是外国人获得的中国身份证号码的前两个代码,但我没有得到证实。 如果您有91开头的身份证或者认识马布里,请帮忙确认相关信息。 基于以上分析,省级地址码的验证和测试流程如下:
var 检查 prov=(val){ var =/^[1-9][0-9]/; var provs={11: '北京', 12: '天津', 1: '河北', 14: '山西', 15: '内蒙古', '辽宁', 22: '吉林', 34: '安徽' , 353: '福建', 363: '江西', 37: '山东', 41:} }返回false}//输出true,37是山东。 日志((37)); //输出false, 16.log((16存在)((16)); 2.2出生日期代码验证
出生日期代码的验证不做解释,直接给出以下功能和测试流程:
var 检查日期=(val){ var =/^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2] [1-9])|10|20|30|31)$/; if( .test(val)){ var 年=val 。 (0, 4); var 月份=val。 (4, 6); var date=val.(6,8);var date2=new date(年'-'月'-'日);if(日期 2 日期 2. ()==((月)-1)){ true; } }返回 false }//输出 true .log(check date(' '); //输出 false: 没有 .log(check date(' '); 2.3 检查代码
校验码的计算有点复杂。 首先给出如下公式:
其中ai表示ID卡体代码的第I个值,Wi表示第I个权重因子值。
权重因子表【表1】:
I 1 2 3 4 5 6 7 8 WI 7 9 10 5 8 2 1 9 10 11 12 13 14 15 16 17 6 3 7 9 10 5 8 4 2 X和校验码转换表【表2】
X 0 1 2 3 4 5 6 7 8 9 10 a18 1 0 X 9 8 7 6 5 4 3 2算法流程:
根据身份证主体代码(前17位)和相应的权重因子(表1),再次计算乘积并求和,将得到的结果与11取模,得到x值。 根据x值查表2,得到a18作为校验码值。 检查代码计算器并测试以下代码:
var 检查码=(val){ var p=/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0- 2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9xx]$/;var 因子=[7,9,10,5 ,8,4,2,1,6,3,7,9,10,5,8,4,2];var 奇偶校验=[1,0,'X',9,8,7,6,5, 4、3、2]; var 代码=val 。 (17); if (p . test (val)) { var sum = 0; for (var I = 0; i17I) { sum = val [I]* [I ]; } if ( [sum % 11] == code . ()) { true; } } false} // 输出true,检查代码是否匹配。 log(check code('x'); //输出false,校验码与.log(check code('x'); 2.4 方案2整体编码
var =(val){ if((val)){ var 日期=val. 子串 (6, 14); if (check date(date)) { if (check prov(val.(0, 2))} { 0 true} } } false} // 输出真实的控制站 Log((' /输出为false,区号与控制台不符。log(('');以上是三胖对身份证号验证的理解和分析,如有不足,请指正。