美文网首页JavaScript
身份证的校验

身份证的校验

作者: 柠檬汁酸 | 来源:发表于2018-03-27 16:14 被阅读16次

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' ));

相关文章

网友评论

    本文标题:身份证的校验

    本文链接:https://www.haomeiwen.com/subject/hcdscftx.html