JavaScript身份证号码有效性验证
最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个,代码还是用自己的舒服哈。
已实现功能:支持15位和18位身份证号,支持地址编码、出生日期、校验位验证。
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
- 地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
- 出生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
- 顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
- 校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
出生日期计算方法:
- 15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19或18,这样就包含了所有1800-1999年出生的人;
- 2000年后出生的肯定都是18位的了没有这个烦恼,至于1800年前出生的,那啥那时应该还没身份证号这个东东。
下面是正则表达式:
- 出生日期1800-2099 (18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])
- 身份证正则表达式 /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
- 15位校验规则 6位地址编码+6位出生日期+3位顺序号
- 18位校验规则 6位地址编码+8位出生日期+3位顺序号+1位校验位
校验位规则:公式:∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
- i----表示号码字符从由至左包括校验码在内的位置序号;
- ai----表示第i位置上的号码字符值;
- Wi----示第i位置上的加权因子,其数值依据公式Wi=2^(n-1)(mod 11)计算得出。
- i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
- Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
01 |
/* |
02 |
//身份证号合法性验证 |
03 |
//支持15位和18位身份证号 |
04 |
//支持地址编码、出生日期、校验位验证 |
05 |
function IdentityCodeValid(code) { |
06 |
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: "国外 " }; |
07 |
var tip = "" ; |
08 |
var pass= true ; |
09 |
|
10 |
if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)){ |
11 |
tip = "身份证号格式错误" ; |
12 |
pass = false ; |
13 |
} |
14 |
|
15 |
else if (!city[code.substr(0,2)]){ |
16 |
tip = "地址编码错误" ; |
17 |
pass = false ; |
18 |
} |
19 |
else { |
20 |
//18位身份证需要验证最后一位校验位 |
21 |
if (code.length == 18){ |
22 |
code = code.split( '' ); |
23 |
//∑(ai×Wi)(mod 11) |
24 |
//加权因子 |
25 |
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]; |
26 |
//校验位 |
27 |
var parity = [ 1, 0, 'X' , 9, 8, 7, 6, 5, 4, 3, 2 ]; |
28 |
var sum = 0; |
29 |
var ai = 0; |
30 |
var wi = 0; |
31 |
for ( var i = 0; i < 17; i++) |
32 |
{ |
33 |
ai = code[i]; |
34 |
wi = factor[i]; |
35 |
sum += ai * wi; |
36 |
} |
37 |
var last = parity[sum % 11]; |
38 |
if (parity[sum % 11] != code[17]){ |
39 |
tip = "校验位错误" ; |
40 |
pass = false ; |
41 |
} |
42 |
} |
43 |
} |
44 |
if (!pass) alert(tip); |
45 |
return pass; |
46 |
} |
47 |
var c = '130981199312253466' ; |
48 |
var res= IdentityCodeValid(c); |
49 |
alert(res); |
JavaScript身份证号码有效性验证的更多相关文章
- Python实现身份证号码有效性验证
# -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...
- Javascript身份证号码验证
"来来来,坐这儿". "什么?我可是有身份的人,怎么能和你坐一块儿".沛笠晃了晃手里的身份证,不屑说道. "你咋不上天呢?有身份还喝油条吃豆浆&quo ...
- js身份证号有效性验证
1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用户名和身份证号就可以实名 ...
- js实现完美身份证号有效性验证
最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...
- js实现完美身份证号有效性验证(转)
转载自:http://www.cnblogs.com/lzrabbit/archive/2011/10/23/2221643.html 最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验 ...
- php验证身份证号码有效性
<?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...
- ios严格检验身份证号码有效性
+ (BOOL)checkIDCard:(NSString *)sPaperId { //判断位数 && sPaperId.length != ) { return NO; } NSS ...
- 【C#】身份证号正确性验证及正则表达式格式验证
身份证前两位各省对应的编号是: 1.华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15: 2.东北地区: 辽宁省|21,吉林省|22,黑龙江省|23: 3.华东地区: ...
- 身份证号码的正则表达式及验证详解(JavaScript,Regex)
简言 在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案.本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案. 身份证号码说明 居民身份证号码,正确.正式的称谓应该是&q ...
随机推荐
- Siki_Unity_1-1_Unity零基础入门_打砖块
1-1 Unity零基础入门 打砖块 任务1:素材源码 www.sikiedu.com/course/77 任务2:Unity介绍 王者荣耀,球球大作战等游戏都是用unity开发的 跨平台的游戏引擎 ...
- mybatis interceptor 处理查询参数及查询结果
拦截器:拦截update,query方法,处理查询参数及返回结果. /** * Created by windwant on 2017/1/12. */ @Intercepts({ @Signatur ...
- java扫描控制台输入
由于因最近练习算法的需要,加上API文档中翻译的太过模糊,做了一些小测试,算是武断的记下一些个人结论. Scanner cin = new Scanner(System.in); 对于cin.next ...
- 56[LeetCode] .Merge Intervals
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...
- Ubuntu 16.04 安装显卡驱动后循环登录和无法设置分辨率的一种解决方案
1. 安装环境 电脑:MSI GP63 显卡:GeForce GTX 1070 系统:Ubuntu 16.04 驱动版本:NVIDIA 384.130 2. 循环登录 如果按照这篇文章 Ubuntu ...
- 虚拟机下 rm -rf / 尝试
环境:虚拟机 系统版本:centOS 5.8.centOS 6.5 1. root权限:rm -rf / 2. root权限:rm -rf /* 测试结果:5.8下执行命令1,2,根目录文件被删除,系 ...
- HDU 3264/POJ 3831 Open-air shopping malls(计算几何+二分)(2009 Asia Ningbo Regional)
Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...
- 基于NABCD评论“探路者”Alpha版作品
1.分析 N(Need):”为了重温贪吃蛇这一经典游戏,本组的选题定为贪吃蛇游戏,并在此基础上进行了新的创新,将普通的贪吃蛇游戏改为单词版贪吃蛇.市面上的英语单词背记软件对于那些缺少英语学习兴趣.毅力 ...
- C++第一次课堂作业 circle
Github上的代码提交
- Deeplearning——Logistics回归
资料来源:1.博客:http://binweber.top/2017/09/12/deep_learning_1/#more——转载,修改更新 2.文章:https://www.qcloud.com/ ...