共计 1579 个字符,预计需要花费 4 分钟才能阅读完成。
由于项目需要,代码需要验证身份证,摸索着学习,写了一个验证函数,直接上代码:
省级地址:
华北:北京 11,天津 12,河北 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
校验规则按级来划分:
1. 后四位生成码,这几位码的生成规则请自行百度,官方给了一个公式和表
2. 年月日
3. 前六位代表区域的值
// 验证后四位生成码
let checkCode = function (val) {
var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
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 code = val.substring(17);
if (p.test(val)) {
var sum = 0;
for (var i = 0; i < 17; i++) {
sum += val[i] * factor[i];
}
if (parity[sum % 11] == code.toUpperCase()) {
return true;
}
}
return false;
}
// 验证年月日
let checkDate = function (val) {
var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
if (pattern.test(val)) {
var year = val.substring(0, 4);
var month = val.substring(4, 6);
var date = val.substring(6, 8);
var date2 = new Date(year + “-” + month + “-” + date);
if (date2 && date2.getMonth() == (parseInt(month) – 1)) {
return true;
}
}
return false;
}
// 验证地区区域辖区的值
let checkProv = function (val) {
let pattern = /^[1-9][0-9]/;
let 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(val)) {
if (provs[val]) {
return true;
}
}
return false;
}
验证:
let checkID = function (val) {
if (checkCode(val)) {
var date = val.substring(6, 14);
if (checkDate(date)) {
if (checkProv(val.substring(0, 2))) {
return true;
}
}
}
return false;
}
checkID(‘ 身份证号 ’);