您现在的位置是:首页 > 文章详情文章详情
Js验证身份证是否正确
会飞的猪
2019-07-18
1283人已围观
简介白码驿站是一个面向开发者的知识共享社区,专注于为开发者打造一个纯净的技术交流社区(源码下载,免费在线图片压缩,jquery插件,插件下载,JS/CSS在线压缩。)-白码驿站
一般情况下,提交数据时, 会对要提交的数据进行各种验证,其他的验证我这里就不讲了, 现在网上有很多, 我要讲的是对身份证的验证, 我看大部分对身份证的验证都是对身份证的位数进行验证(例如15位或者18位), 这个其实是不太准确地,在一些系统中, 以身份证为唯一标识的话, 身份证错误会造成很大的错误, 所以我们要增加身份证的验证。接下来我们先普及一下我们国家对身份证的产生规则做一下了解
中华人民共和国居民身份证验证规则如下:
1.号码的结构:
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,
三位数字顺序码和一位数字校验码。
2.地址码
* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
3.出生日期码
* 表示编码对象出生的年、月、日。
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、通过上面得知如果余数是5,就会在身份证的第18位数字上出现的是7。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。
为了方便大家的理解, 这里就举个例子,例如:一个人的身份证号位为 440306199505180527 , 计算公式应该为:(4*7)+(4*9)+(0*10)+(3*5)+(0*8)+(6*4)+(1*2)+(9*1)+(9*6)+(5*3)+(0*7)+(5*9)+(1*10)+(8*5)+(0*8)+(5*4)+(2*2) = 302;
然后用302%11得出的结果是 余5 , 这样的话我们就知道他的检验码是 7,所以,可以判定这是一个正确的身份证号码。
所以根据以上的规则, 我们可以将其封装成一个函数, 方便我们调用, 由于身份证号码的位数有15位和18位(现在15位基本上没有了), 我们需要增加一个将15位转化为18位的函数, 代码如下
//校验位的检测 checkParity = function (card) { //15位转18位 card = changeFivteenToEighteen(card); var len = card.length; if (len == '18') { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var cardTemp = 0, i, valnum; for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } valnum = arrCh[cardTemp % 11]; if (valnum == card.substr(17, 1)) { return true; } return false; } return false; };
将15位转换为18位
//15位转18位身份证号 changeFivteenToEighteen = function (card) { if (card.length == '15') { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var cardTemp = 0, i; card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6); for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } card += arrCh[cardTemp % 11]; return card; } return card; };
扩展:身份证号码前两位分别是省.自治区或直辖市。3.4两位表示所在的市,5.6两位表示所以的县区。第7-14位表示出生年月日。第15.16位表示所在地派出所的代码,第17位表示性别,一般男的用奇数表示,女的用偶数表示。第18位表示校验码,也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。有时也用X表示,但是不一定是男单女双。
这样的话我们可以对这个函数进行进一步的封装, 如下:
var vcity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" }; checkCard = function (obj) { var card = $(obj).val(); //是否为空 if (card === '') { alert('证件号码不能为空!'); $(obj).focus(); return false; } //校验长度,类型 if (isCardNo(card) === false) { alert('您输入的证件号码不正确,请重新输入'); $(obj).focus(); return false; } //检查省份 if (checkProvince(card) === false) { alert('您输入的证件号码不正确,请重新输入'); $(obj).focus(); return false; } //校验生日 if (checkBirthday(card) === false) { alert('您输入的证件号码生日不正确,请重新输入'); $(obj).focus(); return false; } //检验位的检测 if (checkParity(card) === false) { alert('您的证件号码校验位不正确,请重新输入'); $(obj).focus(); return false; } return true; }; //检查号码是否符合规范,包括长度,类型 isCardNo = function (card) { //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; if (reg.test(card) === false) { return false; } return true; }; //取身份证前两位,校验省份 checkProvince = function (card) { var province = card.substr(0, 2); if (vcity[province] == undefined) { return false; } return true; }; //检查生日是否正确 checkBirthday = function (card) { var len = card.length; //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 if (len == '15') { var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/; var arr_data = card.match(re_fifteen); var year = arr_data[2]; var month = arr_data[3]; var day = arr_data[4]; var birthday = new Date('19' + year + '/' + month + '/' + day); return verifyBirthday('19' + year, month, day, birthday); } //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X if (len == '18') { var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/; var arr_data = card.match(re_eighteen); var year = arr_data[2]; var month = arr_data[3]; var day = arr_data[4]; var birthday = new Date(year + '/' + month + '/' + day); return verifyBirthday(year, month, day, birthday); } return false; }; //校验日期 verifyBirthday = function (year, month, day, birthday) { var now = new Date(); var now_year = now.getFullYear(); //年月日是否合理 if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) { //判断年份的范围(3岁到100岁之间) var time = now_year - year; if (time >= 3 && time <= 100) { return true; } return false; } return false; }; //校验位的检测 checkParity = function (card) { //15位转18位 card = changeFivteenToEighteen(card); var len = card.length; if (len == '18') { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var cardTemp = 0, i, valnum; for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } valnum = arrCh[cardTemp % 11]; if (valnum == card.substr(17, 1)) { return true; } return false; } return false; }; //15位转18位身份证号 changeFivteenToEighteen = function (card) { if (card.length == '15') { var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var cardTemp = 0, i; card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6); for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } card += arrCh[cardTemp % 11]; return card; } return card; };
至此, 身份证验证才算结束。
Tags: JavaScript/Jquery
很赞哦! (5)
下一篇:网站被攻击的血泪史
点击排行
文章分类
- C# (211)
- Excel操作 (7)
- Ext.Net (1)
- FTP (7)
- Git (1)
- Html (7)
- JavaScript/Jquery (173)
- Json (5)
- PhotoShop (60)
- Sql Server (48)
- SVN (5)
- Tesseract-ocr图片识别 (5)
- UML (1)
- VS代码折叠插件 (1)
- winform (2)
- 操作IP地址 (5)
- 操作PDF (5)
- 插件 (166)
- 发送邮件 (2)
- 过滤HTML标签 (2)
- 缓存 (1)
- 跨域 (1)
- 目录操作 (14)
- 软件 (25)
- 视屏操作 (2)
- 数据库恢复 (2)
- 数据库优化 (5)
- 图片操作 (16)
- 文件操作 (24)
- 序列化 (3)
- 压缩 (5)
- 验证码 (4)
- 正则表达式 (21)
- 字符串加密 (11)
猜你喜欢
- SQL Prompt 免费下载 (SQL自定义插件的安装与激活:新版)
- Tesseract-OCR 中文识别
- 大公司为什么还在采用过时的技术
- C# 操作Excel , 支持超链接 跳转Sheet 页面,HSSFHyperlink函数
- SQL SERVER 2012 误删数据恢复过程
- X-UA-Compatible 解决IE浏览器样式不兼容问题
- sql Service 海量数据查询,如何提高查询效率--数据库分区
- sql Service 海量数据查询,如何提高查询效率--数据库设计
- LoadRunner 安装+汉化+破解
- C#中构造函数的执行序列(构造函数初始化器 this base)
- html5+ajax实现文件拖拽上传
- sql Service 海量数据查询,如何提高查询效率--SQL语句优化
评 论