javascript验证身份证号


Posted in Javascript onMarch 03, 2015

我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很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。所以,可以判定这是一个正确的身份证号码。
以上摘自百度百科。

javascript验证身份证号

这个是网上找到的相关资料图片。

根据已知的资料,我们可以把这个方法的内部实现用js写出来。前17位验证比较容易实现,我就不多说了,重点讲下最后一位的校验码。

 // 身份证号验证 

 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>

用百度百科上提供的那身份证号53010219200508011X验证下

javascript验证身份证号

验证能通过,把x换成0试试

javascript验证身份证号

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

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

Javascript 相关文章推荐
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
Jul 18 Javascript
js 获取服务器控件值的代码
Mar 05 Javascript
cument.execCommand()用法深入理解
Dec 04 Javascript
JS 去除Array中的null值示例代码
Nov 20 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
Node.js使用NodeMailer发送邮件实例代码
Mar 06 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
JS烟花背景效果实现方法
Mar 03 #Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 #Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
Mar 03 #Javascript
js+jquery常用知识点汇总
Mar 03 #Javascript
js实现宇宙星空背景效果的方法
Mar 03 #Javascript
Angular中的Promise对象($q介绍)
Mar 03 #Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 #Javascript
You might like
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
php mail to 配置详解
2014/01/16 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
Python的动态重新封装的教程
2015/04/11 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Django内容增加富文本功能的实例
2017/10/17 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
Python实现GIF图倒放
2020/07/16 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
执行总经理岗位职责
2014/02/03 职场文书
会计求职信范文
2014/05/24 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
初婚未育证明样本
2014/10/24 职场文书