console.log('=============基本認證(有bug)==================');
console.log('===1-6位地區(qū)的校驗===');
var regxSec = /^[1-9]\d{5}/;
console.log('===年份的校驗===');
var regYear = /(18|19|20)\d{2}/;
console.log('===月份的校驗===');
var regMonth = /((0[1-9]))|(1[0-2])/;
console.log('===日期的校驗===');
var regDay = /(([0-2][1-9])|10|20|30|31)/;
console.log('===順序碼的校驗===');
var regOrder = /\d{3}/;
console.log('===校驗碼的校驗===');
var regCode = /[0-9Xx]/;
console.log('===綜上所述滥壕,合并上述校驗規(guī)則===');
var regCheck = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[1-2]))(([0-2][1-9])|10|20|30|31)\d{3}[1-9Xx]$/;
var myCode? = '430725198905303965',
errcode = '26524519630230356x';
console.log( regCheck.test(myCode));
console.log( regCheck.test(errcode));
/*****
* 以上身份證驗證有如下漏洞:
* 1.地址碼判定不夠精確,例我國并不存在16,26開頭的地址兽泣,但可以通過驗證绎橘;
* 2.日期判定不夠精確,如19490231也可通過驗證
* 3.校驗碼是由17位的本體碼計算得出的唠倦,以上方案并未校驗此碼
* ********/
console.log('=============完善認證==================');
/*****
* 省級地址校驗碼:
* 華北 : 北京11 称鳞,天津11 ,河北13 稠鼻, 山西14 冈止, 內(nèi)蒙古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
* *
* 由于區(qū)劃代碼的歷史演變移盆,地址后四位校驗變得不太可能
* *******/
//省份前兩位校驗
var checkPro = function( code ){
var pattern = /^[1-9][0-9]/;
var provs = {11 : '北京',12 : '天津',13 : '河北',14 : '山西',15 : '內(nèi)蒙古',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 : '澳門'};
if( pattern.test( code ) ){
if( provs[code] ){
return true ;
}
}
console.log( '地區(qū)校驗不通過' )
return false;
}
//出生日期校驗
var checkDate = function( code ){
var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
if( pattern.test( code ) ){
var year? = code.substring(0,4);
var month = code.substring(4,6);
var day? = code.substring(6,8);
var data2 = new Date( year+'-'+month+'-'+day );
if( data2 && data2.getMonth() == parseInt( month-1) ){
return true;
}
}
console.log( '出生日期校驗不通過' )
return false;
}
//校驗碼驗證
/****
* 校驗碼公式可以去網(wǎng)上找 ;
* 根據(jù)身份證主體碼(前17位)分別與對應(yīng)的加權(quán)因子計算乘積在求和伤为,根據(jù)所得結(jié)果與11取模得到x值咒循。
* 根據(jù)x的值查詢表,得出第18位的校驗碼
* ****/
var checkCode = function( code ){
var pattern? = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[1-2]))(([0-2][1-9])|10|20|30|31)\d{3}[1-9Xx]$/ ,
factory? = [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];
waitCode = code.substring(17);
if( pattern.test( code ) ){
var sum = 0 ;
for( var i = 0 ; i < 17? ; i++){
sum += code[i]*factory[i];
}
if( parity[ sum%11 ] == waitCode.toUpperCase() ){
return true;
}
}
console.log( '校驗碼校驗不通過' )
return false;
}
//整體
var checkID = function( code ){
if( checkCode( code ) ){
var date = code.substring( 6 , 14 );
if( checkDate( date ) ){
if( checkPro( code.substring(0,2) ) ){
return true;
}
}
}
return false
}
console.log( checkID( '430725198905293963' ));
console.log( checkID( '260725198905293963' ));