zoukankan      html  css  js  c++  java
  • 锋利的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}(19d{2}|[2-9]d{3})((0d)|(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}(19d{2}|[2-9]d{3})((0d)|(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。

    如果觉得对你有帮助,请点个赞,谢谢!

    不足与错误之处,敬请批评指正!

      

     
  • 相关阅读:
    支付宝沙箱环境应用
    七牛云视频托管
    腾讯云短息验证码接口
    git远程连接(码云)
    git
    字间距
    html文本保留空格
    mysql重启导致AUTO_INCREMENT从1开始
    js保留两位小数
    vue中watch的基本用法
  • 原文地址:https://www.cnblogs.com/xiaoafei1991/p/4309328.html
Copyright © 2011-2022 走看看