锋利的js之验证身份证号

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

以上摘自百度百科。

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

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

 1 // 身份证号验证
 2 function isIdCard(cardid) {
 3     //身份证正则表达式(18位)
 4     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;
 5     var stard = "10X98765432"; //最后一位身份证的号码
 6     var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系数
 7     var sum = 0;
 8     if (!isIdCard2.test(cardid)) {
 9         return false;
10     }
11     var year = cardid.substr(6, 4);
12     var month = cardid.substr(10, 2);
13     var day = cardid.substr(12, 2);
14     var birthday = cardid.substr(6, 8);
15     if (birthday != dateToString(new Date(year + ‘/‘ + month + ‘/‘ + day))) { //校验日期是否合法
16         return false;
17     }
18     for (var i = 0; i < cardid.length - 1; i++) {
19         sum += cardid[i] * first[i];
20     }
21     var result = sum % 11;
22     var last = stard[result]; //计算出来的最后一位身份证号码
23     if (cardid[cardid.length - 1].toUpperCase() == last) {
24         return true;
25     } else {
26         return false;
27     }
28 }
29
30 //日期转字符串 返回日期格式20080808
31 function dateToString(date) {
32     if (date instanceof Date) {
33         var year = date.getFullYear();
34         var month = date.getMonth() + 1;
35         month = month < 10 ? ‘0‘ + month: month;
36         var day = date.getDate();
37         day = day < 10 ? ‘0‘ + day: day;
38         return year + month + day;
39     }
40     return ‘‘;
41 }

这里只验证18位身份证,15位的一代身份证不能使用了。

这里还验证了日期的合法性,如0230,0431等非法日期,验证是不会通过的。

我们还可以将这个方法加到jquery validate中,方便验证使用。

写个自定义jquery validate校验方法

// 身份证号验证
jQuery.validator.addMethod("isIdCard",
function(value, element) {
    return this.optional(element) || (isIdCard(value));
},
"身份证号非法!");

来个简的demo,看看效果如何。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5         <title>
 6             身份证号校验
 7         </title>
 8         <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js">
 9         </script>
10         <script src="http://www.w3cschool.cc/try/demo_source/static/js/jquery.validate.js">
11         </script>
12         <script type="text/javascript">
13             $(function () {
14                 $("#form1").validate({
15                     rules: {
16                         txtIdCard: "isIdCard"
17                     }
18                 });
19             });
20
21             // 身份证号验证
22             function isIdCard(cardid) {
23                 //身份证正则表达式(18位)
24                 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;
25                 var stard = "10X98765432"; //最后一位身份证的号码
26                 var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系数
27                 var sum = 0;
28                 if (!isIdCard2.test(cardid)) {
29                     return false;
30                 }
31                 var year = cardid.substr(6, 4);
32                 var month = cardid.substr(10, 2);
33                 var day = cardid.substr(12, 2);
34                 var birthday = cardid.substr(6, 8);
35                 if (birthday != dateToString(new Date(year+‘/‘+month+‘/‘+day))) {//校验日期是否合法
36                     return false;
37                 }
38                 for (var i = 0; i < cardid.length - 1; i++) {
39                     sum += cardid[i] * first[i];
40                 }
41                 var result = sum % 11;
42                 var last = stard[result]; //计算出来的最后一位身份证号码
43                 if (cardid[cardid.length - 1].toUpperCase() == last) {
44                     return true;
45                 } else {
46                     return false;
47                 }
48             }
49
50             //日期转字符串 返回日期格式20080808
51             function dateToString(date) {
52                 if (date instanceof Date) {
53                     var year = date.getFullYear();
54                     var month = date.getMonth() + 1;
55                     month = month < 10 ? ‘0‘ + month : month;
56                     var day = date.getDate();
57                     day = day < 10 ? ‘0‘ + day : day;
58                     return year + month + day;
59                 }
60                 return ‘‘;
61             }
62
63             // jquery validate身份证号验证
64             jQuery.validator.addMethod("isIdCard",
65             function (value, element) {
66                 return this.optional(element) || (isIdCard(value));
67             },
68             "身份证号非法!");
69         </script>
70     </head>
71
72     <body>
73         <form id="form1" method="get" action="">
74             <input type="text" id="txtIdCard" name="txtIdCard" />
75             <p>
76                 <input class="submit" type="submit" value="提交" />
77             </p>
78         </form>
79     </body>
80
81 </html>  

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

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

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

如果觉得对你有帮助,请点个赞,谢谢!

不足与错误之处,敬请批评指正!

  

时间: 2024-07-28 16:43:28

锋利的js之验证身份证号的相关文章

js事实验证身份证号

这里禁止了input框粘贴的功能. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="http://ss.lamahui.com/js/base/pc/v1.0.js"></script> <scr

js验证身份证号

/* * 身份证检测(格式.地区.生日.年龄范围) * code:检测字符串 rangeAge:年龄范围[格式为:25-55] * 返回值 0:为空 ,不为0则验证不通过 */ var cityArr = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "

js实现填写身份证号、手机号、准考证号等信息自动空格的效果

咱们做网站的,用户体验那是相当重要的,比如12306抢票需要填写身份证,如果不空格,密密麻麻的给我一种很压抑的感觉,而且也不容易核对信息是否填写正确,所以我就写了一个利用Js实现填写身份证号.手机号.准考证号等信息自动空格的效果. 为了方便,自已定义的一个简单的get()方法和trim()方法,代码如下: //获取对应的对象--function函数. function get(id) { return document.getElementById(id); } //去掉所有空格--String

JavaScript验证身份证号

<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

JS正则表达式验证身份证号码

function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if(reg.test(card) === false) { alert("身份证输入不合法"); return  false; } } 最近的项目中用的需要调用实名认证的接口,实名认证接口价格相比短信而言高了不是几

.net验证身份证号是否符合规则

验证身份证号是否符合规则,比较实用,错判率我自己测试为0,挺好用的,欢迎大神补充. protected bool checkidcard(string idcard) { //验证18位或者17位加大小写x Regex rg = new Regex(@"^\d{17}(\d|X|x)$"); Match mc = rg.Match(idcard); string r = ""; if (!mc.Success) return false; //验证前两位是否符合地区

EXCEL规范数据输入教程-验证身份证号

EXCEL日常工作中经常会输入身份证号码,一不小心就可能出错,今天大飞老师就分享这样一个示例EXCEL规范数据输入教程-验证身份证号. 我们首先要保证在EXCEL中能正确输入身份证号码(PS:身份证号18位,直接输入就会变成科学计数法形式1.235E+17),可以通过两种方式.方式一:单引号+身份证号码如:'123456789111111111,方式二:先改变单元格类型为文本格式,然后再输入身份证号码. 我们要学习一个EXCEL函数LEN,可以返回字符的个数,我们填写一个身份证号码,通过LEN可

Code-Validator:验证身份证号

ylbtech-Code-Validator:验证身份证号 1.返回顶部 1. using System; namespace Sp.Common { public class ValidatorHelper { /// <summary> /// 身份证上数字对应的地址 /// </summary> //enum IDAddress //{ // 北京 = 11, 天津 = 12, 河北 = 13, 山西 = 14, 内蒙古 = 15, 辽宁 = 21, 吉林 = 22, 黑龙江

js实现完美身份证号有效性验证

最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个,代码还是用自己的舒服哈 已实现功能:支持15位和18位身份证号,支持地址编码.出生日期.校验位验证 代码如下: /*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字