公民身份证校验规则最新最全最严格(包含最后一位校验码校验)
身份证号前两位为省级行政区划
11: “北京”,
12: “天津”
13: “河北”,
14: “山西”,
15: “内蒙古”,
正则表达:1[1-5]
21: “辽宁”,
22: “吉林”,
23: “黑龙江”,
正则表达:2[1-3]
31: “上海”,
32: “江苏”,
33: “浙江”,
34: “安徽”,
35: “福建”,
36: “江西”,
37: “山东”,
正则表达:3[1-7]
41: “河南”,
42: “湖北”,
43: “湖南”,
44: “广东”,
45: “广西”,
46: “海南”,
正则表达:4[1-6]
50: “重庆”,
51: “四川”,
52: “贵州”,
53: “云南”,
54: “西藏”,
正则表达:5[0-4]
61: “陕西”,
62: “甘肃”,
63: “青海”,
64: “宁夏”,
65: “新疆”,
正则表达:6[1-5]
省级部分合并正则表达:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]
前六位为县级行政区划,为省级代码加4位数字
正则表达:([16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}
日期部分4位年
4位年,从1900到2099:(19|20)\d{2}
月和日期
0469 4、6、9月有30天
11(0[1-9]|[12][0-9]|30) 11月有30天
上面两行合并后表达为:(?:0[469]|11)(?:0[1-9]|[12][0-9]|30)
013578 1、3、5、7、8月有31天
102 10月和12月有31天
上面两行合并后表达为:(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])
02(0[1-9]|[12][0-9]) 2月最多29天,但约有3/4的时候是28天,这里没办法判断不润年的情况
合并月份和日期部分如下:(?😦?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))
后四位,不对校验位进行检查(太复杂,正则不可能实现)\d{3}[\dXx]
后续有具体校验方法!
完整的身份证正则表达式
(?:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}(?:19|20)\d{2}(?😦?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))\d{3}[\dXx])
validID(rule, value, callback) {
// 身份证验证
// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
// let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
let reg = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/;
log.info("------>校验规则是啥", reg);
if (reg.test(value)) {
let validResult = this.gitNumberValid(value);
log.info("我是校验函数里面的获取到的值validResult", validResult);
if (validResult) {
this.idStatus = true;
this.go(value.length);
callback();
} else {
this.idStatus = false;
callback(new Error("身份证号码不正确"));
}
} else {
this.idStatus = false;
callback(new Error("身份证号码不正确"));
}
},
自动根据身份证号获取生日,性别,年龄(住址太复杂就暂时不写了,理论也能实现)
go(val) {
// 实现自动生成生日,性别,年龄
let iden = this.formShuRuMessage.number;
let sex = null;
let birth = null;
let myDate = new Date();
let month = myDate.getMonth() + 1;
let day = myDate.getDate();
let age = 0;
if (val === 18) {
age = myDate.getFullYear() - iden.substring(6, 10) - 1;
sex = iden.substring(16, 17);
birth =
iden.substring(6, 10) +
"-" +
iden.substring(10, 12) +
"-" +
iden.substring(12, 14);
if (
iden.substring(10, 12) < month ||
(iden.substring(10, 12) == month && iden.substring(12, 14) <= day)
)
age++;
}
if (val === 15) {
age = myDate.getFullYear() - iden.substring(6, 8) - 1901;
sex = iden.substring(13, 14);
birth =
"19" +
iden.substring(6, 8) +
"-" +
iden.substring(8, 10) +
"-" +
iden.substring(10, 12);
if (
iden.substring(8, 10) < month ||
(iden.substring(8, 10) == month && iden.substring(10, 12) <= day)
)
age++;
}
if (sex % 2 === 0) sex = "女";
else sex = "男";
this.formShuRuMessage.sex = sex;
this.formShuRuMessage.age = age;
this.formShuRuMessage.birthday = birth;
// this.formShuRuMessage.birthplace = this.area[iden.substring(0,2)];
log.info(
this.formShuRuMessage,
this.formShuRuMessage.sex,
this.formShuRuMessage.age,
this.formShuRuMessage.birthday
);
},
获取最后一位校验码
//获取身份证最后一步校验码
gitNumberValid(val) {
log.info("------->>>传过来的身份证号", val);
let idArry = val.split("");
log.info("------->>>传过来的身份证号分割结果==>", idArry);
let A1 = idArry[0] * 7;
let A2 = idArry[1] * 9;
let A3 = idArry[2] * 10;
let A4 = idArry[3] * 5;
let A5 = idArry[4] * 8;
let A6 = idArry[5] * 4;
let A7 = idArry[6] * 2;
let A8 = idArry[7] * 1;
let A9 = idArry[8] * 6;
let A10 = idArry[9] * 3;
let A11 = idArry[10] * 7;
let A12 = idArry[11] * 9;
let A13 = idArry[12] * 10;
let A14 = idArry[13] * 5;
let A15 = idArry[14] * 8;
let A16 = idArry[15] * 4;
let A17 = idArry[16] * 2;
let Num = parseInt(
A1 +
A2 +
A3 +
A4 +
A5 +
A6 +
A7 +
A8 +
A9 +
A10 +
A11 +
A12 +
A13 +
A14 +
A15 +
A16 +
A17
);
log.info("----------> 计算出来的身份证数据总和Num", Num);
let yuNum = Num % 11;
log.info("----------> 计算出来的身份证取余yuNum", yuNum);
let validNum = "";
switch (yuNum) {
case 0:
log.info("---0--->上面传过来的余数yuNum", yuNum);
validNum = 1;
break;
case 1:
log.info("---1--->上面传过来的余数yuNum", yuNum);
validNum = 0;
break;
case 2:
log.info("---2--->上面传过来的余数yuNum", yuNum);
validNum = X;
break;
case 3:
log.info("---3--->上面传过来的余数yuNum", yuNum);
validNum = 9;
break;
case 4:
log.info("---4--->上面传过来的余数yuNum", yuNum);
validNum = 8;
break;
case 5:
log.info("---5--->上面传过来的余数yuNum", yuNum);
validNum = 7;
break;
case 6:
log.info("---6--->上面传过来的余数yuNum", yuNum);
validNum = 6;
break;
case 7:
log.info("---7--->上面传过来的余数yuNum", yuNum);
validNum = 5;
break;
case 8:
log.info("---8--->上面传过来的余数yuNum", yuNum);
validNum = 4;
break;
case 9:
log.info("---9--->上面传过来的余数yuNum", yuNum);
validNum = 3;
break;
case 10:
log.info("---10--->上面传过来的余数yuNum", yuNum);
validNum = 2;
break;
default:
log.info("---不该出现这个打印!!!--->上面传过来的余数yuNum", yuNum);
this.$message({
message: "您输入身份证号不对",
type: "warning",
offset: this.hight,
});
break;
}
let result;
if (validNum === parseInt(idArry[17])) {
log.info("比对最后一位校验码结果===>", validNum, idArry[17]);
result = true;
} else {
log.info("比对最后一位校验码结果===>", validNum, idArry[17]);
result = false;
}
log.info("--------->>>检验结果", result);
return result;
},