锋利的js之验证身份证号
我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit。
身份证号是有规则的。
结构和形式
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2.地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3.出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4.顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5.校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
计算方法
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。
如果觉得对你有帮助,请点个赞,谢谢!
不足与错误之处,敬请批评指正!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。