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 相关文章推荐
YUI的Tab切换实现代码
Apr 11 Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 Javascript
chrome下jq width()方法取值为0的解决方法
May 26 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
前端js文件合并的三种方式推荐
May 19 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
js利用clipboardData实现截屏粘贴功能
Oct 12 Javascript
web.js.字符串与正则表达式操作
May 13 Javascript
利用Jasmine对Angular进行单元测试的方法详解
Jun 12 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
LayUi数据表格自定义赋值方式
Oct 26 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 中的批处理的实现
2007/06/14 PHP
php 三维饼图的实现代码
2008/09/28 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php四种基础算法代码实例
2013/10/29 PHP
PHP编程风格规范分享
2014/01/15 PHP
php实现微信公众号无限群发
2015/10/11 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
python中的多重继承实例讲解
2014/09/28 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
python中eval与int的区别浅析
2019/08/11 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
python实现图像全景拼接
2020/03/27 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
大学生学习生活的自我评价
2013/11/01 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
厕所文明标语
2014/06/11 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang