簡短的話
在對用戶進行實名驗證時,經常會用到身份證號的正則表達式和驗證方案。本文列舉了兩種驗證方案,您可以根據自己的實際項目情況選擇合適的方案。
ID號描述
居民身份證號碼正確、正式的稱謂應為“公民身份號碼”。根據中華人民共和國國家標準GB 11643-1999,公民身份號碼是壹個特征組合碼,由壹個17位數字本體碼和壹個數字校驗碼組成。從左到右的順序是:六位地址碼、八位出生日期碼、三位序列碼、壹位校驗碼。
以北京朝陽區某女性身份證號為例。ID號的含義如下圖所示:
註:身份證號來源於GB 11643-1999。
讓我們從零開始完成壹個完整的身份證號驗證過程。
方案1(簡單)
1.1劃分規則
1.1.1地址碼規則:地址碼長度為6位。
從數字1-9開始。
最後五個數字是從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月代碼規則:
月份代碼為2位數。
第壹位是0,第二位是1-9。
或者第壹位是1,第二位是0-2。
按照上面的規則,寫出月碼的正則表達式:/((0[1-9])|(1[0-2])/。
1.1.4日期代碼規則:
日期代碼為2位數。
第壹位是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校驗碼規則:
校驗碼長度為1位。
可以是數字,字母X,也可以是字母X。
根據上述規則,寫出校驗碼的正則表達式:/[0-9Xx]/。
1.2方案1正則表達式
基於以上六條規則,完整的正則表達式和測試程序給出如下:
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]$/;
//輸出true
console . log(p . test(" 11010519491231002 x "));
//輸出false不能以0開頭。
console . log(p . test(" 01010519491231002 x "));
//輸出假年份不能以17開頭。
console . log(p . test(" 11010517491231002 x "));
//輸出假月不能是13。
console . log(p . test(" 11010519491331002 x "));
//輸出假日期不能是32。
console . log(p . test(" 11010519491232002 x "));
//輸出false不能以結尾。
console . log(p . test(" 11010519491232002 a "));1.3方案分析
方案1只是做了壹個基本的格式判斷,主要有三個缺點:
地址碼確定不夠準確。例:國內沒有以16,26開頭的地區,但通過核查日期可以判斷不夠準確。例:19490231也可以驗證,但是二月沒有31奇偶碼,是用17位本體碼計算的,方案1不驗證這個碼方案2(綜合)。
針對方案1的不足,引入方案2來改進方案1的不足。
2.1省地址碼校驗
華北地區:北京11,天津12,河北13,山西14,內蒙古15。
東北:遼寧21,吉林22,黑龍江23
華東:上海31,江蘇32,浙江33,安徽34,福建35,江西36,山東37。
華中:河南41,湖北42,湖南43
華南:廣東44,廣西45,海南46
西南:四川51,貴州52,雲南53,西藏54,重慶50。
西北:陜西61,甘肅62,青海63,寧夏64,新疆65。
特殊:臺灣省71,香港81,澳門82
根據上面的地址碼,對身份證號的前兩位進行校驗,進壹步提高準確性。現地址碼以2013版行政區劃代碼GB/T2260為準。由於區劃代碼的歷史演變,無法檢查地址碼的後四位數字。以三胖的身份證號為例。我的號碼是2321開頭的,但是現在的行政區劃代碼表中沒有這個代碼。因此,本文只檢查前兩個省地址碼。
也有說91是外國人獲得的中國身份證號碼的前兩位數字開始的,但我沒有得到證實。如果妳有91開頭的身份證或者認識馬布裏,請幫忙確認相關信息。
根據以上分析,省地址碼的驗證和測試程序如下:
var checkProv = function (val) {
var模式= /^[1-9][0-9]/;
Var provs = {11:"北京",12:"天津",13:"河北",14:"山西",15:"內蒙古",265433。33:“浙江”,34:“安徽”,35:“福建”,36:“江西”,37:“山東”,41:“河南”,42:“湖北”,43:“湖南”,44:“廣東”,44。61:“陜西”,62:“甘肅”,63:“青海”,64:“寧夏”,65:“新疆”,71:“臺灣省”,81:“香港”,82:“澳門”。
if(pattern.test(val)) {
if(provs[val]) {
返回true
}
}
返回false
}
//輸出真,37是山東。
console . log(check prov(37));
//輸出false,16不存在。
console . log(check prov(16));2.2出生日期代碼驗證
不解釋出生日期代碼的驗證,直接給出以下功能和測試步驟:
var checkDate = function (val) {
var模式= /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
if(pattern.test(val)) {
var year = val.substring(0,4);
var month = val.substring(4,6);
var date = val.substring(6,8);
var date2 =新日期(年+"-"+月+"-"+日期);
如果(日期& amp& ampdate 2 . getmonth()= =(parse int(month)-1)){
返回true
}
}
返回false
}
//輸出true
console . log(checkDate(" 20180212 "));
//Output false二月沒有31天。
console . log(checkDate(" 20180231 "));2.3校驗碼檢查
校驗碼的計算略復雜,先給出以下公式:
其中ai表示身份證體碼的第I個值,Wi表示第I個加權因子值。
加權系數表1:
I 12345678 wi 791058421910113141414151565438。
x 012345678910a 1810x 98765432算法流程:
根據身份證科目編碼(前17位)和對應的加權因子(表1)計算乘積再求和,將所得結果與11取模得到X值。
根據x值查表2,得到a18,即校驗碼值。
檢查代碼計算程序並測試見下面的代碼:
var checkCode = function (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 parity = [ 1,0,' X ',9,8,7,6,5,4,3,2];
var code = val . substring(17);
if(p.test(val)) {
var sum = 0;
for(var I = 0;我& lt17;i++) {
sum+= val[I]* factor[I];
}
if(parity[sum % 11]= = code . toupper case()){
返回true
}
}
返回false
}
//輸出true,校驗碼匹配。
console . log(checkCode(" 11010519491231002 x "));
//輸出false,校驗碼不匹配。
console . log(checkCode(" 110105194912310021 "));2.4方案二總體代碼
var checkID = function (val) {
if(checkCode(val)) {
var date = val.substring(6,14);
if(檢查日期(日期)){
if(checkProv(val.substring(0,2))) {
返回true
}
}
}
返回false
}
//輸出true
console . log(checkID(" 11010519491231002 x "));
//輸出false,校驗碼不匹配。
console . log(checkID(" 110105194912310021 "));
//輸出false,日期代碼不匹配。
console . log(checkID(" 110105194902310026 "));
//輸出false,區號不匹配。
console . log(checkID(" 160105194912310029 "));相信看完這個案例,妳已經掌握了方法。更多精彩請關註Gxl上其他相關文章!
推薦閱讀:
Vue.js定制事件進入表單的方式。
Vue.js如何讓圖片隨意拖動?
如何使用vue2.0axios跨域和渲染?