javaScript验证身份证号

一、首先介绍下身份证的组成结构

        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代码

 // 身份证号验证 
 function isIdCard(cardid) {
     // 身份证正则表达式(18位)
     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;
     var stard = "10X98765432"; // 最后一位身份证的号码
     var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 1-17系数
     var sum = 0;
     if (!isIdCard2.test(cardid)) {
         return false;
     }
     var year = cardid.substr(6, 4);
     var month = cardid.substr(10, 2);
     var day = cardid.substr(12, 2);
     var birthday = cardid.substr(6, 8);
     if (birthday != dateToString(new Date(year + '/' + month + '/' + day))) { // 校验日期是否合法
         return false;
     }
     for (var i = 0; i < cardid.length - 1; i++) {
         sum += cardid[i] * first[i];
     }
     var result = sum % 11;
     var last = stard[result]; // 计算出来的最后一位身份证号码
     if (cardid[cardid.length - 1].toUpperCase() == last) {
         return true;
     } else {
         return false;
     }
 }
 // 日期转字符串 返回日期格式20080808
 function dateToString(date) {
     if (date instanceof Date) {
         var year = date.getFullYear();
         var month = date.getMonth() + 1;
         month = month < 10 ? '0' + month: month;
         var day = date.getDate();
         day = day < 10 ? '0' + day: day;
         return year + month + day;
     }
     return '';
 }

这里只验证18位身份证,15位的一代身份证不能使用了。

这里还验证了日期的合法性,如0230,0431等非法日期,验证是不会通过的。

我们还可以将这个方法加到jquery validate中,方便验证使用。

写个自定义jquery validate校验方法

代码如下:

// 身份证号验证  
jQuery.validator.addMethod("isIdCard",
function(value, element) {
    return this.optional(element) || (isIdCard(value));
},
"身份证号非法!");
四、来个简的demo,看看效果如何。

 <!DOCTYPE html>
 <html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <title>
             身份证号校验
         </title>
         <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js">
         </script>
         <script src="http://www.w3cschool.cc/try/demo_source/static/js/jquery.validate.js">
         </script>
         <script type="text/javascript">
             $(function () {
                 $("#form1").validate({
                     rules: {
                         txtIdCard: "isIdCard"
                     }
                 });
             });
             // 身份证号验证 
             function isIdCard(cardid) {
                 //身份证正则表达式(18位) 
                 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;
                 var stard = "10X98765432"; //最后一位身份证的号码
                 var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系数
                 var sum = 0;
                 if (!isIdCard2.test(cardid)) {
                     return false;
                 }
                 var year = cardid.substr(6, 4);
                 var month = cardid.substr(10, 2);
                 var day = cardid.substr(12, 2);
                 var birthday = cardid.substr(6, 8);
                 if (birthday != dateToString(new Date(year+'/'+month+'/'+day))) {//校验日期是否合法
                     return false;
                 }
                 for (var i = 0; i < cardid.length - 1; i++) {
                     sum += cardid[i] * first[i];
                 }
                 var result = sum % 11;
                 var last = stard[result]; //计算出来的最后一位身份证号码
                 if (cardid[cardid.length - 1].toUpperCase() == last) {
                     return true;
                 } else {
                     return false;
                 }
             }
             //日期转字符串 返回日期格式20080808
             function dateToString(date) {
                 if (date instanceof Date) {
                     var year = date.getFullYear();
                     var month = date.getMonth() + 1;
                     month = month < 10 ? '0' + month : month;
                     var day = date.getDate();
                     day = day < 10 ? '0' + day : day;
                     return year + month + day;
                 }
                 return '';
             }
             // jquery validate身份证号验证
             jQuery.validator.addMethod("isIdCard",
             function (value, element) {
                 return this.optional(element) || (isIdCard(value));
             },
             "身份证号非法!");
         </script>
     </head>
     <body>
         <form id="form1" method="get" action="">
             <input type="text" id="txtIdCard" name="txtIdCard" />
             <p>
                 <input class="submit" type="submit" value="提交" />
             </p>
         </form>
     </body>
 </html>  

现在用身份证号验证下

验证通过 下面我们把X换成0试试

验证失败!

我们写的验证方法成功了!不信你用自己的身份证号试试。原来用js校验身份证号so easy。

以上就是本文的全部内容了,希望大家能够喜欢。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值