UNPKG

4.89 kBJavaScriptView Raw
1export default function validateIdCard(code) {
2 code = String(code);
3
4 var vcity = {
5 11: "北京",
6 12: "天津",
7 13: "河北",
8 14: "山西",
9 15: "内蒙古",
10 21: "辽宁",
11 22: "吉林",
12 23: "黑龙江",
13 31: "上海",
14 32: "江苏",
15 33: "浙江",
16 34: "安徽",
17 35: "福建",
18 36: "江西",
19 37: "山东",
20 41: "河南",
21 42: "湖北",
22 43: "湖南",
23 44: "广东",
24 45: "广西",
25 46: "海南",
26 50: "重庆",
27 51: "四川",
28 52: "贵州",
29 53: "云南",
30 54: "西藏",
31 61: "陕西",
32 62: "甘肃",
33 63: "青海",
34 64: "宁夏",
35 65: "新疆",
36 71: "台湾",
37 81: "香港",
38 82: "澳门",
39 91: "国外"
40 };
41
42 var checkcode = function(code) {
43 //是否为空
44 if (
45 !code ||
46 !iscodeNo(code) ||
47 !checkProvince(code) ||
48 !checkBirthday(code) ||
49 !checkParity(code)
50 ) {
51 return false;
52 }
53 return true;
54 };
55
56 //检查号码是否符合规范,包括长度,类型
57 var iscodeNo = function(code) {
58 //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
59 var reg = /(^\d{15}$)|(^\d{17}(\d|[xX])$)/;
60 if (reg.test(code) === false) {
61 return false;
62 }
63 return true;
64 };
65
66 //取身份证前两位,校验省份
67 var checkProvince = function(code) {
68 var province = code.substr(0, 2);
69 if (vcity[province] == undefined) {
70 return false;
71 }
72 return true;
73 };
74
75 //检查生日是否正确
76 var checkBirthday = function(code) {
77 var len = code.length;
78 //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
79 if (len == "15") {
80 var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
81 var arr_data = code.match(re_fifteen);
82 var year = arr_data[2];
83 var month = arr_data[3];
84 var day = arr_data[4];
85 var birthday = new Date("19" + year + "/" + month + "/" + day);
86 return verifyBirthday("19" + year, month, day, birthday);
87 }
88 //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
89 if (len == "18") {
90 var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/i;
91 var arr_data = code.match(re_eighteen);
92 var year = arr_data[2];
93 var month = arr_data[3];
94 var day = arr_data[4];
95 var birthday = new Date(year + "/" + month + "/" + day);
96 return verifyBirthday(year, month, day, birthday);
97 }
98 return false;
99 };
100
101 //校验日期
102 var verifyBirthday = function(year, month, day, birthday) {
103 var now = new Date();
104 var now_year = now.getFullYear();
105 //年月日是否合理
106 if (
107 birthday.getFullYear() == year &&
108 birthday.getMonth() + 1 == month &&
109 birthday.getDate() == day
110 ) {
111 //判断年份的范围(3岁到100岁之间)
112 var time = now_year - year;
113 if (time >= 3 && time <= 100) {
114 return true;
115 }
116 return false;
117 }
118 return false;
119 };
120
121 //校验位的检测
122 var checkParity = function(code) {
123 //15位转18位
124 code = changeFivteenToEighteen(code);
125 var len = code.length;
126 if (len == "18") {
127 var arrInt = new Array(
128 7,
129 9,
130 10,
131 5,
132 8,
133 4,
134 2,
135 1,
136 6,
137 3,
138 7,
139 9,
140 10,
141 5,
142 8,
143 4,
144 2
145 );
146 var arrCh = new Array(
147 "1",
148 "0",
149 "X",
150 "9",
151 "8",
152 "7",
153 "6",
154 "5",
155 "4",
156 "3",
157 "2"
158 );
159 var codeTemp = 0,
160 i,
161 valnum;
162 for (i = 0; i < 17; i++) {
163 codeTemp += code.substr(i, 1) * arrInt[i];
164 }
165 valnum = arrCh[codeTemp % 11];
166 if (valnum == code.substr(17, 1)) {
167 return true;
168 }
169 return false;
170 }
171 return false;
172 };
173
174 //15位转18位身份证号
175 var changeFivteenToEighteen = function(code) {
176 if (code.length == "15") {
177 var arrInt = new Array(
178 7,
179 9,
180 10,
181 5,
182 8,
183 4,
184 2,
185 1,
186 6,
187 3,
188 7,
189 9,
190 10,
191 5,
192 8,
193 4,
194 2
195 );
196 var arrCh = new Array(
197 "1",
198 "0",
199 "X",
200 "9",
201 "8",
202 "7",
203 "6",
204 "5",
205 "4",
206 "3",
207 "2"
208 );
209 var codeTemp = 0,
210 i;
211 code = code.substr(0, 6) + "19" + code.substr(6, code.length - 6);
212 for (i = 0; i < 17; i++) {
213 codeTemp += code.substr(i, 1) * arrInt[i];
214 }
215 code += arrCh[codeTemp % 11];
216 return code;
217 }
218 return code;
219 };
220
221 return checkcode(code);
222}