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 相关文章推荐
利用jQuery的$.event.fix函数统一浏览器event事件处理
Dec 21 Javascript
Javascript 自适应高度的Tab选项卡
Apr 05 Javascript
Javascript算符的优先级介绍
Mar 20 Javascript
javascript计算用户打开网页的停留时间
Jan 09 Javascript
JS限制文本框只能输入数字和字母方法
Feb 28 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
JS随机数产生代码分享
Feb 24 Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
详解js静态检查工具eslint配置文件
Nov 23 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 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
对javascript和select部件的结合运用
2006/10/09 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP 第二节 数据类型之转换
2012/04/28 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
python获得一个月有多少天的方法
2015/06/04 Python
python中os模块详解
2016/10/14 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
Python列表解析配合if else的方法
2018/06/23 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
肯尼迪就职演说稿
2013/12/31 职场文书
体育教学随笔感言
2014/02/24 职场文书
篮球赛口号
2014/06/18 职场文书
校运会口号
2014/06/18 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis