小弟加急写的,难免有错误,请诸位发现问题的及时指正。感谢!!!
/** 身份证验证 */
export function regIdentityCard(idCardNo) {
if (!idCardNo || (idCardNo.length !== 15 && idCardNo.length !== 18)) {
return false;
}
//检查省份
if (!checkProvince(idCardNo)) {
return false;
}
if (idCardNo.length === 18) {
/**
* 6位地区码 \d{6}
* 年 (18|19|([23]\d))\d{2}
* 月 ((0[1-9])|(10|11|12))
* 日 (([0-2][1-9])|10|20|30|31)
* 3位顺序码 \d{3}
* 校验码 [0-9Xx]
*/
const regCode = /^\d{15}|(\d{6}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])$/;
if (regCode.test(idCardNo)) {
// 前17位每项的系数
const coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 除11取余的结果对应的校验位(最后一位)的值
const checkDigitMap = [
'1',
'0',
'X',
'9',
'8',
'7',
'6',
'5',
'4',
'3',
'2'
];
let sum = 0; // 总和
for (let i = 0; i < 17; i++) {
sum += idCardNo[i] * coefficient[i];
}
return idCardNo[17] === checkDigitMap[sum % 11];
}
return false;
} else {
// 15位身份证
const regCode = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
return regCode.test(idCardNo);
}
}
/** 校验省份 */
function checkProvince(idCardNo) {
const 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: '国外'
};
return !!CITY[idCardNo.substr(0, 2)];
}