揭开身份证验证的神秘面纱
正则验证身份证号码
HTML5学堂:曾经一直觉得用正则验证身份证号码是很简单的~但是,当真正挖掘身份证号码的规则之后,才发现,想要写好一个正则验证也没有那么容易。最近一周利利出差,所以,只能周六跟大家一起分享一下自己的研究结果啦~
身份证的规则
书写一个正则之前,需要先了解一下身份证的基本规则
- /*
- * 身份证18位编码规则:dddddd yyyymmdd xxx y
- * dddddd:6位地区编码
- * yyyymmdd: 出生年(四位年)月日,如:19910215
- * xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
- * y: 校验码,该位数值可通过前17位计算获得
- * HTML5学堂出品 http://www.h5course.com 请尊重原创
- * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
- * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
- * 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
- */
校验位计算方法:身份证前17位,每一位数字和相应位数的加权因子进行乘法运算,之后求和(17项之和),再用这个和对11取余,所得的余数作为“验证位数组Y”的下标,也就是Y[余数],找到“验证位数组Y”中的相应数字,如果身份证最后一位和这个数字吻合,则身份证号码合法(如果最后一位是X/x,就对应于“验证位数组Y”中的10这个数字)
简单的号码计算小例子
假如是这个身份证号码(这个身份证号码是我瞎编的):110203198811120342。
于是,复杂的计算开始了。取出身份证前17位,与[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]中对应的位分别进行乘法运算,于是乎:
sum = 1 * 7 + 1 * 9 + 0 * 10 + 2 * 5 + ... + 3 * 4 + 4 * 2。
我们能够计算出来,总和为177。之后用177对11取余,余数为1。那么在[1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]数组中,下标为1的元素就是第二个元素,也就是数值为0。此时将0与身份证号的最后一位(2)做比较,很明显,错误,那么也证明了这个号码是我瞎编的了……
验证身份证号码的正则如何写?
身份证规则
我们将一个身份证号码拆开:身份证18位编码规则:dddddd yyyymmdd xxx y
1) dddddd:6位地区编码,地区编码没有以0开头的,举一个例子,北京用的就是110开头,河北用的就是130开头,福建省用的是350开头,此类。
2) yyyymmdd: 出生年(四位年)月日,前四位是年份,没啥可说的,月份只能是01~12,日期只能是01~31
3) xxx:三位数字
4) y: 校验码,0~9以及X(有时有人会写成x)
相对应的正则出炉喽
1) 地区编码:[1-9]d{5}
2) 出生年份:[1-9]d{3}
3) 出生月份:((0[1-9])|(1[0-2]))
4) 出生日期:((0[1-9])|([1-2]d)|(3[0-1]))
5) 最后四位:((d{4})|(d{3}[Xx]))
完整匹配身份证号码的正则
于是乎,完整匹配身份证号码的正则华丽丽的诞生了~~~
- var reg = /^[1-9]d{5}[1-9]d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]d)|(3[0-1]))((d{4})|(d{3}[Xx]))$/;
完了吗?别急,往下接着看~~~
使用JS增强号码的可控性
利利此处采用的是返回对象的设置方式,主要是便于获取完整的信息,需要注意的就是要在返回时提供比较合理的API了,不然对方是看不懂滴~~~
我们希望用户通过调用验证身份证号码的方法,不仅仅能够得到是否正确,还能够得到更加详细的信息。所以,一起先来看代码喽~
/*
* 功能:验证身份证是否可用,如果可用,则提取生日、性别等信息
* 参数:传入一个字符串或者一个数字均可
* 返回:包含基本信息的对象
* 作者:HTML5学堂 http://www.h5course.com
*/
function regIDAllInf(str){
str = str.toString();
var reg = /^[1-9]d{5}[1-9]d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]d)|(3[0-1]))((d{4})|(d{3}[Xx]))$/;
// 用于存储结果
var result = {};
if (reg.test(str)) {
var sum = 0;
var arrID = str.split("");
var arrWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
for (var i = 0; i < arrWi.length; i++) {
sum += arrID[i] * arrWi[i];
};
sum %= 11;
var lastID = arrID[arrID.length - 1];
if (lastID == "X" || lastID == "x") {
lastID = 10;
};
if (arrY[sum] == lastID) {
result["check"] = true;
result["birthday"] = str.substr(6, 8);
result["cityCode"] = str.substr(0, 6);
result["gender"] = (str.substr(14, 3) % 2 == 0) ? "女" : "男";
} else {
result["check"] = false;
result["error"] = "身份证号码输入错误";
}
} else {
result["check"] = false;
result["error"] = "身份证号码格式有误";
}
return result;
}
console.log(regIDAllInf(str)); // 此处请将str替换为身份证号码进行测试
如果格式正确,会返回匹配正确,并返回性别、区域、生日的信息。如果错误,也会根据情况返回不同的错误提示信息。
本文章内容小编:HTML5学堂-利利。耗时4h~
- Linux NTP时间服务器
- 子查询的另一种方式——映射
- LNMP架构之搭建wordpress博客网站
- Nginx的各种报错总结
- 谷歌TensorFlowLite正式发布,机器学习框架向移动端大步挺进!
- ABP+AdminLTE+Bootstrap Table权限管理系统一期
- 18888元秒下的域名sdhlx.com已建站
- 锂离子电池发明人:自动驾驶汽车电池需要更加耐用
- Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
- Nginx服务编译安装、日志功能、状态模块及访问认证模式实操
- 快速入门系列--WebAPI--03框架你值得拥有
- 快速入门系列--MVC--06视图
- 腾讯入局物业管理 欲改造传统服务?
- ExtJs学习笔记(4)_EditorGridPanel(可编辑的网格控件)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WordPress评论插件wpDiscuz任意文件上传复现
- 干货 | 性能提升400%,ClickHouse在携程酒店数仓的实践
- 干货 | 携程如何基于ARIMA时序分析做业务量的预测
- Python爬取王者荣耀全套皮肤
- 怎么搭建直播平台,合理使用验证码工具类
- 再见了SpringMVC,这个框架有点厉害,甚至干掉了Servlet!
- 可以旋转的3D韦恩图你见过吗?
- BFE.dev前端刷题 104. 按层遍历DOM树
- nodejs,mongodb不同时区问题
- AkShare-中国宏观-全社会客货运输量
- AkShare-中国宏观-邮电业务基本情况
- AkShare-中国宏观-国际旅游外汇收入构成
- AkShare-中国宏观-民航客座率及载运率
- AkShare-中国宏观-航贸运价指数
- 您应该知道的11个JavaScript和TypeScript速记