-
Notifications
You must be signed in to change notification settings - Fork 0
/
isIdCard.js
100 lines (95 loc) · 2.06 KB
/
isIdCard.js
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* 判断是否为身份证号
* @param {String} value
* @return {Boolean}
* 源自 https://juejin.im/post/5aa8d89af265da23866f9669
*/
// 检测校验码
const checkCode = val => {
let 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]$/
let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
let code = val.substring(17)
if (p.test(val)) {
let sum = 0
for (let i = 0; i < 17; i++) {
sum += val[i] * factor[i]
}
if (parity[sum % 11] == code.toUpperCase()) {
return true
}
}
return false
}
// 检测出生日期
let checkDate = val => {
let pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/
if (pattern.test(val)) {
let year = val.substring(0, 4)
let month = val.substring(4, 6)
let date = val.substring(6, 8)
let date2 = new Date(year + "-" + month + "-" + date)
if (date2.getMonth() == (parseInt(month) - 1)) {
return true
}
}
return false
}
// 检测省份代码
let checkProv = 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
}
const isIdCard = val => {
if (checkCode(val)) {
let date = val.substring(6, 14)
if (checkDate(date)) {
if (checkProv(val.substring(0, 2))) {
return true
}
}
}
return false
}
export default isIdCard