校验规则
身份证有效性校验
// 18 号身份证号码校验,根据 ISO 7064:1983.MOD 11-2 算法进行校验
function checkCardID(cardID) {
cardID = cardID.toUpperCase();
// 18位身份证号码,前17位为数字,最后一位是校验位,可能为数字或字符X
if (!/^\d{17}([0-9]|X)$/.test(cardID)) {
return false;
}
// 校验位按照 ISO 7064:1983.MOD 11-2 的规定生成,X 可以认为是数字10。
let checkSum = 0; // 校验和
let checkDigit; // 校验位
let checkDigitArray = [
'1',
'0',
'X',
'9',
'8',
'7',
'6',
'5',
'4',
'3',
'2'
]; // 校验位数组
let weightArray = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 权重数组
for (let i = 0; i < 17; i++) {
checkSum += cardID.substr(i, 1) * weightArray[i];
}
checkDigit = checkDigitArray[checkSum % 11];
return checkDigit === cardID.substr(17, 1) ? true : false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
中文名称校验
/^[\u4e00-\u9fa5]+(·[\u4e00-\u9fa5]+)*$/
1
UTF-8 (Unicode)编码里,中文的编码范围是 u4e00-u9fa5,中文名称包含汉字以及 ·