JavaScript实现身份证验证代码


Posted in Javascript onFebruary 17, 2016

18位身份证号码各位的含义

1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位男为单数,女为双数;
18位为校验码,0-9和X,由公式随机产生;

举例:

340523 1980 0101 0013这个身份证号的含义:
34为安徽省
05为马鞍山市
23为和县
19800101为出生日期(1980年1月1日)
001为顺序号(1为单数,代表为男性)
3为验证码

行政区划代码

最新县及县以上行政区划代码(截止2014年10月31日)

北京市 (110000 BJ)
天津市 (120000 TJ)
河北省 (130000 HE)
山西省 (140000 SX)
内蒙古自治区 (150000 NM)
辽宁省 (210000 LN)
吉林省 (220000 JL)
黑龙江省 (230000 HL)
上海市 (310000 SH)
江苏省 (320000 JS)
浙江省 (330000 ZJ)
安徽省 (340000 AH)
福建省 (350000 FJ)
江西省 (360000 JX)
山东省 (370000 SD)
河南省 (410000 HA)
湖北省 (420000 HB)
湖南省 (430000 HN)
广东省 (440000 GD)
广西壮族自治区 (450000 GX)
海南省 (460000 HI)
重庆市 (500000 CQ)
四川省 (510000 SC)
贵州省 (520000 GZ)
云南省 (530000 YN)
西藏自治区 (540000 XZ)
陕西省 (610000 SN)
甘肃省 (620000 GS)
青海省 (630000 QH)
宁夏回族自治区 (640000 NX)
新疆维吾尔自治区 (650000 XJ)
台湾省 (710000 Tw)
香港特别行政区 (810000 HK)
澳门特别行政区 (820000 Mo)

身份证第18位(校验码)的计算方法
将身份证号码前面的17位数分别乘以不同的系数;
从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
将这17位数字和系数相乘的结果相加;
用加出来和除以11,看余数是多少;
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;
其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
举例:
某男性的身份证号码是340523198001010013。我们要看看这个身份证是不是合法的身份证。

首先我们得出前17位的乘积和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185
然后再求余:
185 % 11 = 9
最后通过对应规则就可以知道余数9对应的数字是3。所以,可以判定这是一个合格的身份证号码。

JavaScript校验18位身份证

var city = {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:"国外"};

var ID = '340523198001010013';

首先校验位数是否是18位:

if(!/^\d{17}(\d|x)$/i.test(ID)) return false;
// \d  匹配数字
// ^  匹配开始
// $  匹配结尾
// i  不区分大小写
// {17} 匹配17次
// \d|x 匹配数字或x

然后校验开头两位是否是合法的省(直辖市/自治区):

if(city[ID.substr(0,2)] === undefined) return "非法地区";

// stringObject.substr(start,length) 方法可在字符串中抽取从 start 下标开始的指定数目的字符
// 访问对象属性时除了可以用点(.)语法外,也可以用中括号([]),用中括号时更灵活

然后再校验出生日期是否合法:

var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
var d = new Date(birthday);
var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
var currentTime = new Date().getTime();
var time = d.getTime();
if(time >= currentTime || birthday !== newBirthday) return '非法生日';
// 获取身份证的年月日,然后再 new 一个 Date,再对比这两个日期是否一致
// 这里用Number()主要是因为身份证的日期是带0的,而new Date()出来的日期是不带0的,Number()之后就都不带0了

最后判断校验码是否正确:

var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
var sum = 0, i, residue;
for(i=0; i<17; i++) {
 sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) '非法证号';

如果以上校验都通过了,则是一个合法的身份证号;

完整代码

<script>
 function checkID(ID) {
  if(typeof ID !== 'string') return '非法字符串';
  var city = {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:"国外"};
  var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
  var d = new Date(birthday);
  var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
  var currentTime = new Date().getTime();
  var time = d.getTime();
  var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  var sum = 0, i, residue;
 
  if(!/^\d{17}(\d|x)$/i.test(ID)) return '非法身份证';
  if(city[ID.substr(0,2)] === undefined) return "非法地区";
  if(time >= currentTime || birthday !== newBirthday) return '非法生日';
  for(i=0; i<17; i++) {
   sum += ID.substr(i, 1) * arrInt[i];
  }
  residue = arrCh[sum % 11];
  if (residue !== ID.substr(17, 1)) return '非法身份证哦';
 
  return city[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?" 男":"女")
 }
</script>
Javascript 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
form.submit()不能提交表单的原因分析
Oct 23 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 Javascript
vue实现添加与删除图书功能
Oct 07 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
AngularJS 最常用的功能汇总
Feb 17 #Javascript
AngularJS身份验证的方法
Feb 17 #Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 #Javascript
实例讲解jquery中mouseleave和mouseout的区别
Feb 17 #Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 #Javascript
Bootstrap中CSS的使用方法
Feb 17 #Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 #Javascript
You might like
php微信支付之公众号支付功能
2018/05/30 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
JavaScript高级程序设计
2006/12/29 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
python实现在字符串中查找子字符串的方法
2015/07/11 Python
利用Python实现图书超期提醒
2016/08/02 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
专科应届生求职信
2013/11/24 职场文书
致100米运动员广播稿
2014/02/14 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
销售经理岗位职责
2014/03/16 职场文书
装配出错检讨书
2014/09/23 职场文书
汽车销售员工作总结
2015/08/12 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
2019求职信大礼包
2019/05/15 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers