身份证号的验证与解析
最近参加一些招聘,很多时候时候身份证号都会作为表单的一部分,需要用户进行填写。有些表单在填写了身份证号之后,还需要用户手动填写籍贯、性别、出生年月、以及年龄等信息,其实这些信息都在身份证号里面包含了。
身份证号的组成
要验证和解析身份证号,首先应该知道身份证号的组成。
省 市 区 | 年 月 日 | 序列号 | 校验位 |
---|---|---|---|
XX XX XX | XXXXX XX XX | XXX | X |
身份证号可以划分成4部分,分别对应地区、出生年月、序列号、校验位。
- 第1-6位,对应具体到区(县)的地址,一般能够对生源地、籍贯等信息。
区号与地区名的对照关系,有相关的类库可以进行对比。
https://github.com/qianshou/district/blob/master/district-simple.sql - 第7-14位,对应YYYY-mm-dd格式的出生年月。
- 第15-17位,对应顺序码,该地区同年同月同日生的人的编号,男性都是奇数,女性都是偶数。
- 第18位位校验位,对前面17为数字进行校验,检查身份证号的正确性。
具体的校验规则如下:
身份证号的前17位数,分别乘以规定参数,然后累计和除以11,得到的余数通过映射表进而得到校验位的值。
乘数参数表
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
余数映射表
余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
校验位 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
身份证号的验证
身份证号的验证,可以分为正则表达式的匹配验证和校验位的验证两部分。
由于身份证号的验证,在前端用的比较多,下面给出javascript的实现。
function checkIDNumber(id) {//兼容最后一位X大小写id = id.toUpperCase();//正则检查if(! /^[1-3]\d{16}[\d,X]$/.test(id)){return false;}//校验位检查var vcode = id[id.length-1];var params = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];var map = ['1','0','X','9','8','7','6','5','4','3','2'];var sum = 0;for(var i=0;i<params.length;i++){sum += id[i]*params[i];}var remainder = sum%11;if(vcode == map[remainder]){return true;}else{return false;}
}
身份证号的解析
在函数checkIDNumber的基础上进行修改,实现身份证号的检查与解析。
var district_map = require('./district-simple.json');
function parseIDNumber(id) {//兼容最后一位X大小写id = id.toUpperCase();//正则检查,并获取相关信息var data = /^([1-3]\d{5})(\d{8})(\d{3})([\d,X])$/.exec(id);if(!data){return false;}//校验位检查var vcode = id[id.length-1];var params = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];var map = ['1','0','X','9','8','7','6','5','4','3','2'];var sum = 0;for(var i=0;i<params.length;i++){sum += id[i]*params[i];}var remainder = sum%11;if(vcode != map[remainder]){return false;}var ret = [];//获取地区信息var district = [];var discode = data[1];var provcode = discode.substring(0,2)+'0000';var citycode = discode.substring(0,4)+'00';if(typeof district_map[provcode] != "undefined"){district.push(district_map[provcode])}if(typeof district_map[citycode] != "undefined"){district.push(district_map[citycode]);}if(typeof district_map[provcode] != "undefined"){district.push(district_map[discode]);}ret['district'] = district;//获取出生日期var birth_date = data[2];var year = parseInt(birth_date.substring(0,4));var month = parseInt(birth_date.substring(4,6));var day = parseInt(birth_date.substring(6,8));var birth = [year,month,day];ret['birth'] = birth;//获取年龄var date = new Date();var year_diff = date.getFullYear()-year;var month_diff = date.getMonth()+1-month;var day_diff = date.getDate()-day;var age = year_diff;if(month_diff<0 || (month_diff==0&&day_diff<0)){age--;}ret['age'] = age;//获取性别信息var serno = data[3];var sex = serno%2;ret['sex'] = sex;return ret;
}
为了方便调用,我将sql语句中的区号和名称的对应关系,生成了相关的json文件。在该函数的实现中,为了方便调用,采用了node.js的引入机制使用的json文件,如果在前端JavaScript调用时,可以采用ajax请求引入json文件信息,然后进行匹配。
https://github.com/qianshou/district/blob/master/district-simple.json
身份证号的验证与解析相关推荐
- JavaScript 身份证号有效验证详解及实例代码
这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- js实现完美身份证号有效性验证+身份证与姓名匹配
/* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...
- 正则表达式验证身份证号以及验证校验位的正确性
需求:给定一个字符串,从中提取出身份证号 关于验证15位和18位身份证号的正则表达式可以参考下面的内容: http://www.cppcns.com/wangluo/re/183062.html 一. ...
- javascript实现完美身份证号有效性验证15位18位
欢迎各位朋友! 前几天在开发中要求对用户的身份证号进行比较严格的校验,所以才有了这些代码, 下面的这些代码主要包括对身份证长度,地区,出生日期的校验. 方法在return时返回了一个是否通过以及提 ...
- 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)
window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...
- js身份证号有效性验证
js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...
- 身份证号合法性验证、电话手机验证、邮箱验证、银行卡验证、车牌验证
js验证: 身份证号合法性验证 电话手机验证 邮箱验证 银行卡验证 车牌验证 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function Iden ...
- 身份证号码的验证与解析
18位身份证号码解析器,可以验证输入的字符串是否是真实的身份证号,还可以将身份证号码中的信息解析出来,包括籍贯(因为到县的数据太多,只到省一级).出生日期和性别. package cn.myj.api ...
- JS 身份证号格式验证
var idcard = data.field.idcard; if(!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(idcard)){ //验证身份证号15位或18位la ...
最新文章
- Android中出现内存泄露的原因
- HTML与CSS基础之常用选择器(一)
- 【javascript】DOM操作方法(3)——document节点属性
- 前端学习(2520):环境搭建
- .net中的硬盘操作(针对Windows )
- Oracle-(if/case/以及模拟注册登录)练习-20131015
- 同步异步 阻塞非阻塞
- RTX5 | 配置文件RTX_Config.h(一)
- drawio流程图软件_Win10 一般软件个人收集
- 陶老师ESD、EMI、EMC讲座
- SQL教程(从入门到精通)
- java人脸识别开源算法_开源-人脸识别认证-java封装
- NBNS扫描工具nbtscan-unixwiz
- mysql mpm_mysql mpm
- 2018仲恺农业计算机大类录取,仲恺农业工程学院2019录取分数线预测
- 书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著
- C#按钮添加图片的解决
- 利用正则截取匹配的字符串前后内容同
- LeetCode 854 相似度为K的字符串
- 从《虎嗅》改版说说小作坊如何做产品和项目管理
热门文章
- 视频标清、高清、超清、1080P(这么多不同规格)
- 【system】利用Diskpart命令(cmd)解决装机分区格式不对,增大C盘空间问题
- 【增大C盘内存——拓展卷】C盘与未分配空间之间有恢复分区的解决方法——安装diskgenius
- 计算机相关美文摘抄,值得摘抄的好文章,好文章摘抄大全
- 天才数学家科学家用电脑研究出“彩票必胜公式必赢方案”,连中14次大奖
- win7开机弹计算机,win7开机弹出Windows Installer窗口的解决方法
- 购买你的青春和一切ZT
- 360安全服务器组件怎样禁止,如何禁用360安全浏览器服务组件?如何正确的操作...
- 溺水舆情管控工作总结
- 剑灵南天国服务器位置,剑灵南天国实验室商城说明及FAQ