console.log('=============基本认证(有bug)==================');
console.log('===1-6位地区的校验===');
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('===综上所述,合并上述校验规则===');
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 , 内蒙古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
* *
* 由于区划代码的历史演变,地址后四位校验变得不太可能
* *******/
//省份前两位校验
var checkPro = function( code ){
var pattern = /^[1-9][0-9]/;
var provs = {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 : '澳门'};
if( pattern.test( code ) ){
if( provs[code] ){
return true ;
}
}
console.log( '地区校验不通过' )
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;
}
//校验码验证
/****
* 校验码公式可以去网上找 ;
* 根据身份证主体码(前17位)分别与对应的加权因子计算乘积在求和,根据所得结果与11取模得到x值。
* 根据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' ));