鋒利的js之驗證身份證號


我們在做互聯網網站時,注冊個人資料時,經常要用到身份證號,我們需要對身份證進驗證,不然別人隨便輸個號碼就通過,讓你感覺這個網站做得很shit。

身份證號是有規則的。

結構和形式

  1.號碼的結構 
  公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。 
  2.地址碼 
  表示編碼對象常住戶口所在縣(市、旗、區)的行政區划代碼,按GB/T2260的規定執行。 
  3.出生日期碼 
  表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。 
  4.順序碼 
  表示在同一地址碼所標識的區域范圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。 
  5.校驗碼
  根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。

計算方法

1、將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、將這17位數字和系數相乘的結果相加。
3、用加出來和除以11,看余數是多少?
4、余數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最后一位身份證的號碼為1-0-X -9-8-7-6-5-4-3-2。
5、通過上面得知如果余數是3,就會在身份證的第18位數字上出現的是9。如果對應的數字是2,身份證的最后一位號碼就是羅馬數字x。
例如:某男性的身份證號碼為【53010219200508011x】, 我們看看這個身份證是不是合法的身份證。
首先我們得出前17位的乘積和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是 189,然后用189除以11得出的結果是189/11=17----2,也就是說其 余數是2。最后通過對應規則就可以知道余數2對應的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。
以上摘自百度百科。
這個是網上找到的相關資料圖片。
根據已知的資料,我們可以把這個方法的內部實現用js寫出來。前17位驗證比較容易實現,我就不多說了,重點講下最后一位的校驗碼。
 1 // 身份證號驗證 
 2 function isIdCard(cardid) {
 3     //身份證正則表達式(18位) 
 4     var isIdCard2 = /^[1-9]\d{5}(19\d{2}|[2-9]\d{3})((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{4}|\d{3}X)$/i;
 5     var stard = "10X98765432"; //最后一位身份證的號碼
 6     var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系數
 7     var sum = 0;
 8     if (!isIdCard2.test(cardid)) {
 9         return false;
10     }
11     var year = cardid.substr(6, 4);
12     var month = cardid.substr(10, 2);
13     var day = cardid.substr(12, 2);
14     var birthday = cardid.substr(6, 8);
15     if (birthday != dateToString(new Date(year + '/' + month + '/' + day))) { //校驗日期是否合法
16         return false;
17     }
18     for (var i = 0; i < cardid.length - 1; i++) {
19         sum += cardid[i] * first[i];
20     }
21     var result = sum % 11;
22     var last = stard[result]; //計算出來的最后一位身份證號碼
23     if (cardid[cardid.length - 1].toUpperCase() == last) {
24         return true;
25     } else {
26         return false;
27     }
28 }
29 
30 //日期轉字符串 返回日期格式20080808
31 function dateToString(date) {
32     if (date instanceof Date) {
33         var year = date.getFullYear();
34         var month = date.getMonth() + 1;
35         month = month < 10 ? '0' + month: month;
36         var day = date.getDate();
37         day = day < 10 ? '0' + day: day;
38         return year + month + day;
39     }
40     return '';
41 }

 

這里只驗證18位身份證,15位的一代身份證不能使用了。

這里還驗證了日期的合法性,如0230,0431等非法日期,驗證是不會通過的。

我們還可以將這個方法加到jquery validate中,方便驗證使用。

寫個自定義jquery validate校驗方法

// 身份證號驗證   
jQuery.validator.addMethod("isIdCard",
function(value, element) {
    return this.optional(element) || (isIdCard(value));
},
"身份證號非法!");

來個簡的demo,看看效果如何。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5         <title>
 6             身份證號校驗
 7         </title>
 8         <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js">
 9         </script>
10         <script src="http://www.w3cschool.cc/try/demo_source/static/js/jquery.validate.js">
11         </script>
12         <script type="text/javascript">
13             $(function () {
14                 $("#form1").validate({
15                     rules: {
16                         txtIdCard: "isIdCard"
17                     }
18                 });
19             });
20 
21             // 身份證號驗證 
22             function isIdCard(cardid) {
23                 //身份證正則表達式(18位) 
24                 var isIdCard2 = /^[1-9]\d{5}(19\d{2}|[2-9]\d{3})((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{4}|\d{3}X)$/i;
25                 var stard = "10X98765432"; //最后一位身份證的號碼
26                 var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系數
27                 var sum = 0;
28                 if (!isIdCard2.test(cardid)) {
29                     return false;
30                 }
31                 var year = cardid.substr(6, 4);
32                 var month = cardid.substr(10, 2);
33                 var day = cardid.substr(12, 2);
34                 var birthday = cardid.substr(6, 8);
35                 if (birthday != dateToString(new Date(year+'/'+month+'/'+day))) {//校驗日期是否合法
36                     return false;
37                 }
38                 for (var i = 0; i < cardid.length - 1; i++) {
39                     sum += cardid[i] * first[i];
40                 }
41                 var result = sum % 11;
42                 var last = stard[result]; //計算出來的最后一位身份證號碼
43                 if (cardid[cardid.length - 1].toUpperCase() == last) {
44                     return true;
45                 } else {
46                     return false;
47                 }
48             }
49 
50             //日期轉字符串 返回日期格式20080808
51             function dateToString(date) {
52                 if (date instanceof Date) {
53                     var year = date.getFullYear();
54                     var month = date.getMonth() + 1;
55                     month = month < 10 ? '0' + month : month;
56                     var day = date.getDate();
57                     day = day < 10 ? '0' + day : day;
58                     return year + month + day;
59                 }
60                 return '';
61             }
62 
63             // jquery validate身份證號驗證
64             jQuery.validator.addMethod("isIdCard",
65             function (value, element) {
66                 return this.optional(element) || (isIdCard(value));
67             },
68             "身份證號非法!");
69         </script>
70     </head>
71     
72     <body>
73         <form id="form1" method="get" action="">
74             <input type="text" id="txtIdCard" name="txtIdCard" />
75             <p>
76                 <input class="submit" type="submit" value="提交" />
77             </p>
78         </form>
79     </body>
80 
81 </html>  
View Code

 

用百度百科上提供的那身份證號53010219200508011X驗證下

驗證能通過,把x換成0試試

校驗不通過,我們寫的驗證方法成功了!不信你用自己的身份證號試試。原來用js校驗身份證號so easy。

如果覺得對你有幫助,請點個贊,謝謝!

不足與錯誤之處,敬請批評指正!

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM