js 验证身份证信息有效性


Posted in Javascript onMarch 28, 2014

以下是根据身份证号码编码规则,使用JS对其进行有效性验证代码

IdCard-Validate.js代码如下:

/** 
* 身份证15位编码规则:dddddd yymmdd xx p 
* dddddd:地区码 
* yymmdd: 出生年月日 
* xx: 顺序类编码,无法确定 
* p: 性别,奇数为男,偶数为女 
* <p /> 
* 身份证18位编码规则:dddddd yyyymmdd xxx y 
* dddddd:地区码 
* yyyymmdd: 出生年月日 
* xxx:顺序类编码,无法确定,奇数为男,偶数为女 
* y: 校验码,该位数值可通过前17位计算获得 
* <p /> 
* 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] 
* 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 
* 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 ) 
* i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置 
* 
*/ var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子 
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表X 
function IdCardValidate(idCard) { 
idCard = trim(idCard.replace(/ /g, "")); 
if (idCard.length == 15) { 
return isValidityBrithBy15IdCard(idCard); 
} else if (idCard.length == 18) { 
var a_idCard = idCard.split("");// 得到身份证数组 
if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ 
return true; 
}else { 
return false; 
} 
} else { 
return false; 
} 
} 
/** 
* 判断身份证号码为18位时最后的验证位是否正确 
* @param a_idCard 身份证号码数组 
* @return 
*/ 
function isTrueValidateCodeBy18IdCard(a_idCard) { 
var sum = 0; // 声明加权求和变量 
if (a_idCard[17].toLowerCase() == 'x') { 
a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作 
} 
for ( var i = 0; i < 17; i++) { 
sum += Wi[i] * a_idCard[i];// 加权求和 
} 
valCodePosition = sum % 11;// 得到验证码所位置 
if (a_idCard[17] == ValideCode[valCodePosition]) { 
return true; 
} else { 
return false; 
} 
} 
/** 
* 通过身份证判断是男是女 
* @param idCard 15/18位身份证号码 
* @return 'female'-女、'male'-男 
*/ 
function maleOrFemalByIdCard(idCard){ 
idCard = trim(idCard.replace(/ /g, ""));// 对身份证号码做处理。包括字符间有空格。 
if(idCard.length==15){ 
if(idCard.substring(14,15)%2==0){ 
return 'female'; 
}else{ 
return 'male'; 
} 
}else if(idCard.length ==18){ 
if(idCard.substring(14,17)%2==0){ 
return 'female'; 
}else{ 
return 'male'; 
} 
}else{ 
return null; 
} 
// 可对传入字符直接当作数组来处理 
// if(idCard.length==15){ 
// alert(idCard[13]); 
// if(idCard[13]%2==0){ 
// return 'female'; 
// }else{ 
// return 'male'; 
// } 
// }else if(idCard.length==18){ 
// alert(idCard[16]); 
// if(idCard[16]%2==0){ 
// return 'female'; 
// }else{ 
// return 'male'; 
// } 
// }else{ 
// return null; 
// } 
} 
/** 
* 验证18位数身份证号码中的生日是否是有效生日 
* @param idCard 18位书身份证字符串 
* @return 
*/ 
function isValidityBrithBy18IdCard(idCard18){ 
var year = idCard18.substring(6,10); 
var month = idCard18.substring(10,12); 
var day = idCard18.substring(12,14); 
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
// 这里用getFullYear()获取年份,避免千年虫问题 
if(temp_date.getFullYear()!=parseFloat(year) 
||temp_date.getMonth()!=parseFloat(month)-1 
||temp_date.getDate()!=parseFloat(day)){ 
return false; 
}else{ 
return true; 
} 
} 
/** 
* 验证15位数身份证号码中的生日是否是有效生日 
* @param idCard15 15位书身份证字符串 
* @return 
*/ 
function isValidityBrithBy15IdCard(idCard15){ 
var year = idCard15.substring(6,8); 
var month = idCard15.substring(8,10); 
var day = idCard15.substring(10,12); 
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
if(temp_date.getYear()!=parseFloat(year) 
||temp_date.getMonth()!=parseFloat(month)-1 
||temp_date.getDate()!=parseFloat(day)){ 
return false; 
}else{ 
return true; 
} 
} 
//去掉字符串头尾空格 
function trim(str) { 
return str.replace(/(^\s*)|(\s*$)/g, ""); 
}

更新版本二
function checkIdcard(num) 
{ 
num = num.toUpperCase(); 
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) 
{ 
//alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'); 
return false; 
} 
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
//下面分别分析出生日期和校验位 
var len, re; 
len = num.length; 
if (len == 15) 
{ 
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); 
var arrSplit = num.match(re); //检查生日日期是否正确 
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); 
var bGoodDay; 
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); 
if (!bGoodDay) 
{ 
//alert('输入的身份证号里出生日期不对!'); 
return false; 
} 
else 
{ 
//将15位身份证转成18位 
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
var nTemp = 0, i; 
num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); 
for(i = 0; i < 17; i ++) 
{ 
nTemp += num.substr(i, 1) * arrInt[i]; 
} 
num += arrCh[nTemp % 11]; 
return true; 
} 
} 
if (len == 18) 
{ 
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); 
var arrSplit = num.match(re); 
//检查生日日期是否正确 
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); 
var bGoodDay; 
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); 
if (!bGoodDay) 
{ 
//alert(dtmBirth.getYear()); 
//alert(arrSplit[2]); 
//alert('输入的身份证号里出生日期不对!'); 
return false; 
} 
else 
{ 
//检验18位身份证的校验码是否正确。 
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
var valnum; 
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
var nTemp = 0, i; 
for(i = 0; i < 17; i ++) 
{ 
nTemp += num.substr(i, 1) * arrInt[i]; 
} 
valnum = arrCh[nTemp % 11]; 
if (valnum != num.substr(17, 1)) 
{ 
//alert('18位身份证的校验码不正确!应该为:' + valnum); 
return false; 
} 
return true; 
} 
} 
return false; 
}
Javascript 相关文章推荐
JS中==与===操作符的比较
Mar 21 Javascript
JavaScript 对象、函数和继承
Jul 07 Javascript
js修改地址栏URL参数解决url参数问题
Dec 15 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
jQuery实现的放大镜效果示例
Sep 13 Javascript
浅谈js算法和流程控制
Dec 29 Javascript
使用JavaScript为一张图片设置备选路径的方法
Jan 04 Javascript
从零开始做一个pagination分页组件
Mar 15 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
Sep 05 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
JS中怎样判断undefined(比较不错的方法)
Mar 27 #Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 #Javascript
jquery选择符快速提取web表单数据示例
Mar 27 #Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 #Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 #Javascript
js弹出确认是否删除对话框
Mar 27 #Javascript
js或jquery实现页面打印可局部打印
Mar 27 #Javascript
You might like
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
使用PHP下载CSS文件中的图片的代码
2013/09/24 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
超级强大的表单验证
2006/06/26 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
python中的列表推导浅析
2014/04/26 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
selenium+python实现自动登录脚本
2018/04/22 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
使用Python实现画一个中国地图
2019/11/23 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
出纳岗位职责
2013/11/09 职场文书
社会保险接收函
2014/01/12 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
mysql如何配置白名单访问
2021/06/30 MySQL