最近参加一些招聘,很多时候时候身份证号都会作为表单的一部分,需要用户进行填写。有些表单在填写了身份证号之后,还需要用户手动填写籍贯、性别、出生年月、以及年龄等信息,其实这些信息都在身份证号里面包含了。

身份证号的组成

要验证和解析身份证号,首先应该知道身份证号的组成。

省 市 区 年 月 日 序列号 校验位
XX XX XX XXXXX XX XX XXX X

身份证号可以划分成4部分,分别对应地区、出生年月、序列号、校验位。

  1. 第1-6位,对应具体到区(县)的地址,一般能够对生源地、籍贯等信息。
    区号与地区名的对照关系,有相关的类库可以进行对比。
    https://github.com/qianshou/district/blob/master/district-simple.sql
  2. 第7-14位,对应YYYY-mm-dd格式的出生年月。
  3. 第15-17位,对应顺序码,该地区同年同月同日生的人的编号,男性都是奇数,女性都是偶数。
  4. 第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

身份证号的验证与解析相关推荐

  1. JavaScript 身份证号有效验证详解及实例代码

    这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  2. js实现完美身份证号有效性验证+身份证与姓名匹配

    /* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...

  3. 正则表达式验证身份证号以及验证校验位的正确性

    需求:给定一个字符串,从中提取出身份证号 关于验证15位和18位身份证号的正则表达式可以参考下面的内容: http://www.cppcns.com/wangluo/re/183062.html 一. ...

  4. javascript实现完美身份证号有效性验证15位18位

    欢迎各位朋友!   前几天在开发中要求对用户的身份证号进行比较严格的校验,所以才有了这些代码, 下面的这些代码主要包括对身份证长度,地区,出生日期的校验. 方法在return时返回了一个是否通过以及提 ...

  5. 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)

    window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...

  6. js身份证号有效性验证

    js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...

  7. 身份证号合法性验证、电话手机验证、邮箱验证、银行卡验证、车牌验证

    js验证: 身份证号合法性验证 电话手机验证 邮箱验证 银行卡验证 车牌验证 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function Iden ...

  8. 身份证号码的验证与解析

    18位身份证号码解析器,可以验证输入的字符串是否是真实的身份证号,还可以将身份证号码中的信息解析出来,包括籍贯(因为到县的数据太多,只到省一级).出生日期和性别. package cn.myj.api ...

  9. JS 身份证号格式验证

    var idcard = data.field.idcard; if(!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(idcard)){ //验证身份证号15位或18位la ...

最新文章

  1. Android中出现内存泄露的原因
  2. HTML与CSS基础之常用选择器(一)
  3. 【javascript】DOM操作方法(3)——document节点属性
  4. 前端学习(2520):环境搭建
  5. .net中的硬盘操作(针对Windows )
  6. Oracle-(if/case/以及模拟注册登录)练习-20131015
  7. 同步异步 阻塞非阻塞
  8. RTX5 | 配置文件RTX_Config.h(一)
  9. drawio流程图软件_Win10 一般软件个人收集
  10. 陶老师ESD、EMI、EMC讲座
  11. SQL教程(从入门到精通)
  12. java人脸识别开源算法_开源-人脸识别认证-java封装
  13. NBNS扫描工具nbtscan-unixwiz
  14. mysql mpm_mysql mpm
  15. 2018仲恺农业计算机大类录取,仲恺农业工程学院2019录取分数线预测
  16. 书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著
  17. C#按钮添加图片的解决
  18. 利用正则截取匹配的字符串前后内容同
  19. LeetCode 854 相似度为K的字符串
  20. 从《虎嗅》改版说说小作坊如何做产品和项目管理

热门文章

  1. 视频标清、高清、超清、1080P(这么多不同规格)
  2. 【system】利用Diskpart命令(cmd)解决装机分区格式不对,增大C盘空间问题
  3. 【增大C盘内存——拓展卷】C盘与未分配空间之间有恢复分区的解决方法——安装diskgenius
  4. 计算机相关美文摘抄,值得摘抄的好文章,好文章摘抄大全
  5. 天才数学家科学家用电脑研究出“彩票必胜公式必赢方案”,连中14次大奖
  6. win7开机弹计算机,win7开机弹出Windows Installer窗口的解决方法
  7. 购买你的青春和一切ZT
  8. 360安全服务器组件怎样禁止,如何禁用360安全浏览器服务组件?如何正确的操作...
  9. 溺水舆情管控工作总结
  10. 剑灵南天国服务器位置,剑灵南天国实验室商城说明及FAQ