匹配身份证 |
|
先说说网上流传的版本: |
\d{15}|\d{18} |
d{15} |
\d{18} 可以判断,但是有些粗糙 |
从身份证可以解析出地址、生日、性别等,因此特别说明一下: |
身份证规则 |
中国的身份证为15位(一代)或18位(二代),区别在于二代证只是在一代证的第七位数字前加了19和在末尾加了一位验证码 |
将15位升级为18位,并解析18位号码构成(地址、生日、性别) |
代码如下: |
function parseID(ID) { |
if ( ID.length == 15 ) { |
// 升级为18位 |
ID = ID.substr( 0, 6 ) + "19" + ID.substr( 6 ); |
// 前17位对应的系数 |
var rank = [ |
"7" , "9" , "10" , "5" , "8" , "4" , "2" , "1" , "6" , "3" , "7" , "9" , "10" , "5" , "8" , "4" , "2" |
]; |
// 前17为加权除以17后的余数对应的最后一位身份证号码 |
var last = [ |
"1" , "0" , "X" , "9" , "8" , "7" , "6" , "5" , "4" , "3" , "2" |
]; |
// 加权和 |
for ( var i = 0, sum = 0, len = ID.length; i < len; i++) |
sum += ID[ i ] * rank[ i ]; |
// 加上最后一位 |
ID += last[ sum % 11 ]; |
} |
if ( ID.length != 18 ) return null ; |
|
var match = rid.exec( ID ); |
return match ? { |
ID : ID, |
area : match[ 1 ], |
y : match[ 2 ], |
m : match[ 3 ], |
d : match[ 4 ], |
sex : match[ 5 ] % 2 |
} : null ; |
} |
限制: |
这里只是解析出了地址代码,如何将代码转换为实际地址请问度娘。 |
返回对象中的sex为1(男)或0(女),并未做转换,如果页面显示需要,可以这样转换:sex ? "男" : "女" |
测试: |
console.info( parseID( "142327840821047" ) ); |
console.info( parseID( "142327198408210470" ) ); |