代码
function IdentityCodeValid(code) {
var city={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:"澳门",91:"国外 "};
//var tip = "";
var pass= true;
//判断格式是否正确
if(!code || !/^\d{2}(0[1-9]|[1-9][0-9])\d{2}((((1[6-9]|[2-9]\d)\d{2})(0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})(0[13456789]|1[012])(0[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})02(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))0229))\d{3}(\d|x|X)$/i.test(code)){
//tip = "身份证号格式错误";
pass = false;
}
//判断前两位的地址编码是否正确
else if(!city[code.substr(0,2)]){
//tip = "地址编码错误";
pass = false;
}
else{
//18位身份证需要验证最后一位校验位
if(code.length == 18){
code = code.split('');
//∑(ai×Wi)(mod 11)
//加权因子
var factor = [ 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 sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++)
{
ai = code[i];
wi = factor[i];
sum += ai * wi;
}
var last = parity[sum % 11];
if(parity[sum % 11] != code[17]){
//tip = "校验位错误";
pass =false;
}
}
}
return pass;
}
说明
一代身份证自2013年1月1日起停止使用
正则分析
规则说明
15位身份证号码组成
格式:ddddddyymmddxxs
共15位
dddddd
为6位的地方代码,根据这6位可以获得该身份证号所在地。yy
为2位的年份代码,是身份证持有人的出身年份。mm
为2位的月份代码,是身份证持有人的出身月份。dd
为2位的日期代码,是身份证持有人的出身日。xx
为2位的顺序码,这个是随机数。s
为1位的性别代码,奇数代表男性,偶数代表女性。
18位身份证号码组成
格式:ddddddyyyymmddxxsp
共18位
dddddd
为6位的地方代码,根据这6位可以获得该身份证号所在地。yyyy
为4位的年份代码,是身份证持有人的出身年份。mm
为2位的月份代码,是身份证持有人的出身月份。dd
为2位的日期代码,是身份证持有人的出身日。xx
为2位的顺序码,这个是随机数。s
为1位的性别代码,奇数代表男性,偶数代表女性。p
为校验位
其他部分都和15位的相同。年份代码由原来的2位升级到4位。最后一位为校验位。
编号 | 说明 | 规则 |
---|---|---|
前1、2位数字 | 所在省(直辖市、自治区)的代码 | 规则见说明1 |
第3、4位数字 | 所在地级市(自治州)的代码 | 从01到99 |
第5、6位数字 | 所在区(县、自治县、县级市)的代码 | 从00到99 |
第7—14位数字 | 出生年、月、日 4位年2位月2位日, | 年从1900到2100,月从01到12,日从01到31 |
第15、16位数字 | 所在地的派出所的代码 | 从00到99 |
第17位数字 | 表示性别 | 奇数表示男性(1、3、5、7、9),偶数表示女性(0、2、4、6、8) |
第18位数字 | 校检码 | 它是用来检验身份证的正确性。规则见说明2 |
所在省(直辖市、自治区)的代码
代码 | 地区 | 代码 | 地区 |
---|---|---|---|
11-15 | 京 津 冀 晋 蒙 | 21-23 | 辽 吉 黑 |
31-37 | 沪 苏 浙 皖 闽 赣 鲁 | 41-46 | 豫 鄂 湘 粤 桂 琼 |
50-54 | 渝 川 贵 云 藏 | 61-65 | 陕 甘 青 宁 新 |
81-82 | 港 澳 | 71 | 台湾 |
校验码规则
- 十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16
,先对前17位数字的权求和Ai
:表示第i位置上的身份证号码数字值Wi
:表示第i位置上的加权因子Wi
: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
- 计算模
Y = mod(S, 11)
- 通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
- 校验码:
1 0 X 9 8 7 6 5 4 3 2
也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。