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 扩展方法
May 06 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
详解AngularJS实现表单验证
Dec 10 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
AngularJs点击状态值改变背景色的实例
Dec 18 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
Jul 19 Javascript
webpack中的模式(mode)使用详解
Feb 20 Javascript
解决vue的router组件component在import时不能使用变量问题
Jul 26 Javascript
JS算法教程之字符串去重与字符串反转
Dec 15 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
咖啡的传说和历史
2021/03/03 新手入门
php代码审计比较有意思的例子
2014/05/07 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
python比较2个xml内容的方法
2015/05/11 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python如何计算语句执行时间
2019/11/22 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
《燕子》教学反思
2014/02/18 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
宣传标语大全
2014/07/01 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
2014年客房部工作总结
2014/11/22 职场文书
升职自我推荐信范文
2015/03/25 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android