第一種方法:
在用戶注冊頁面有些需求要求的比較嚴(yán)格,需要對身份證js驗證是否合法,通過此功能嚴(yán)格此系統(tǒng)軟件,從而過濾到很多水客。下面就此實(shí)現(xiàn)方法給大家講解下。
很多時候我們都是通過一組正則表達(dá)式來判斷用戶輸入的身份證是否合法,那在用正則表達(dá)式判斷之前,你對身份證號的組成有多少了解呢?下面來說說一個身份證號里面包含了多少的信息:
1、號碼的結(jié)構(gòu)
公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。
2、地址碼(前六位數(shù))
表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按gb/T2260的規(guī)定執(zhí)行。
3、出生日期碼(第七位至十四位)
表示編碼對象出生的年、月、日,按gb/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。
4、順序碼(第十五位至十七位)
表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
5、校驗碼(第十八位數(shù))
作為尾號的校驗碼,是由號碼編制單位按統(tǒng)一的公式計算出來的,如果某人的尾號是0-9,都不會出現(xiàn)X,但如果尾號是10,那么就得用X來代替,因為如果用10做尾號,那么 此人的身份證就變成了19位。X是羅馬數(shù)字的10,用X來代替10,可以保證公民的身份證符合國家標(biāo)準(zhǔn)。
在知道身份證號結(jié)構(gòu)組成各部分的意思后,我們開始進(jìn)入主題:
1、定義一個全國地區(qū)的對象
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"內(nèi)蒙古",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:"國外"}
2、正則表達(dá)式判斷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function isCardID(sId){ var iSum=0 ; var info= "" ; if (!/^\d{17}(\d|x)$/i.test(sId)) return "你輸入的身份證長度或格式錯誤" ; sId=sId.replace(/x$/i, "a" ); if (aCity[parseInt(sId.substr(0,2))]== null ) return "你的身份證地區(qū)非法" ; sBirthday=sId.substr(6,4)+ "-" +Number(sId.substr(10,2))+ "-" +Number(sId.substr(12,2)); var d= new Date(sBirthday.replace(/-/g, "/" )) ; if (sBirthday!=(d.getFullYear()+ "-" + (d.getMonth()+1) + "-" + d.getDate())) return "身份證上的出生日期非法" ; for ( var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) ; if (iSum%11!=1) return "你輸入的身份證號非法" ; //aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女");//此次還可以判斷出輸入的身份證號的人性別 return true ; } |
第二種方法:
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
function scCard(){ var scType=document.getElementById( "sc_card_type" ).value; if (scType== "1" ){ var scCard=document.getElementById( "sc_card_num" ).value; if (scCard.length!=0){ if (!checkCard(scCard)){ $( "#errorTips" ).html( "身份證號碼格式錯誤" ); } else { $( "#errorTips" ).html( "" ); } } } return false ; } //function checkidno(obj) { var vcity={ 11: "北京" ,12: "天津" ,13: "河北" ,14: "山西" ,15: "內(nèi)蒙古" , 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: "國外" }; checkCard = function (obj) { //var card = document.getElementById('card_no').value; //是否為空 // if(card === '') // { // return false; //} //校驗長度,類型 if (isCardNo(obj) === false ) { return false ; } //檢查省份 if (checkProvince(obj) === false ) { return false ; } //校驗生日 if (checkBirthday(obj) === false ) { return false ; } //檢驗位的檢測 if (checkParity(obj) === false ) { return false ; } return true ; }; //檢查號碼是否符合規(guī)范,包括長度,類型 isCardNo = function (obj) { //身份證號碼為15位或者18位,15位時全為數(shù)字,18位前17位為數(shù)字,最后一位是校驗位,可能為數(shù)字或字符X var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; if (reg.test(obj) === false ) { return false ; } return true ; }; //取身份證前兩位,校驗省份 checkProvince = function (obj) { var province = obj.substr(0,2); if (vcity[province] == undefined) { return false ; } return true ; }; //檢查生日是否正確 checkBirthday = function (obj) { var len = obj.length; //身份證15位時,次序為省(3位)市(3位)年(2位)月(2位)日(2位)校驗位(3位),皆為數(shù)字 if (len == '15' ) { var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/; var arr_data = obj.match(re_fifteen); var year = arr_data[2]; var month = arr_data[3]; var day = arr_data[4]; var birthday = new Date( '19' +year+ '/' +month+ '/' +day); return verifyBirthday( '19' +year,month,day,birthday); } //身份證18位時,次序為省(3位)市(3位)年(4位)月(2位)日(2位)校驗位(4位),校驗位末尾可能為X if (len == '18' ) { var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/; var arr_data = obj.match(re_eighteen); var year = arr_data[2]; var month = arr_data[3]; var day = arr_data[4]; var birthday = new Date(year+ '/' +month+ '/' +day); return verifyBirthday(year,month,day,birthday); } return false ; }; //校驗日期 verifyBirthday = function (year,month,day,birthday) { var now = new Date(); var now_year = now.getFullYear(); //年月日是否合理 if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) { //判斷年份的范圍(3歲到100歲之間) var time = now_year - year; if (time >= 0 && time <= 130) { return true ; } return false ; } return false ; }; //校驗位的檢測 checkParity = function (obj) { //15位轉(zhuǎn)18位 obj = changeFivteenToEighteen(obj); var len = obj.length; if (len == '18' ) { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array( '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' ); var cardTemp = 0, i, valnum; for (i = 0; i < 17; i ++) { cardTemp += obj.substr(i, 1) * arrInt[i]; } valnum = arrCh[cardTemp % 11]; if (valnum == obj.substr(17, 1)) { return true ; } return false ; } return false ; }; //15位轉(zhuǎn)18位身份證號 changeFivteenToEighteen = function (obj) { if (obj.length == '15' ) { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array( '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' ); var cardTemp = 0, i; obj = obj.substr(0, 6) + '19' + obj.substr(6, obj.length - 6); for (i = 0; i < 17; i ++) { cardTemp += obj.substr(i, 1) * arrInt[i]; } obj += arrCh[cardTemp % 11]; return obj; } return obj; }; |