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 相关文章推荐
非常不错的功能强大代码简单的管理菜单美化版
Jul 09 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
Mar 18 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
JavaScript监听和禁用浏览器回车事件实例
Jan 31 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
浅析java线程中断的办法
Jul 29 Javascript
浅谈React碰到v-if
Nov 04 Javascript
vue组件之间数据传递的方法实例分析
Feb 12 Javascript
JavaScript实现文件下载并重命名代码实例
Dec 12 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
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生成略缩图代码
2012/07/16 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
python 动态加载的实现方法
2017/12/22 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
opencv实现简单人脸识别
2021/02/19 Python
Python定义一个Actor任务
2020/07/29 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
实习期自我鉴定
2013/10/11 职场文书
高中军训感言200字
2014/02/23 职场文书
担保书怎么写
2014/04/01 职场文书
2014最新实习证明模板
2014/10/02 职场文书
大学学生个人总结
2015/02/15 职场文书
光荣之路观后感
2015/06/12 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书