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 相关文章推荐
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
Apr 23 Javascript
IE下通过a实现location.href 获取referer的值
Sep 04 Javascript
js实现简单div拖拽功能实例
May 12 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
微信小程序引用公共js里的方法的实例详解
Aug 17 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
搭建vue开发环境
Jul 19 Javascript
从组件封装看Vue的作用域插槽的实现
Feb 12 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 26 Javascript
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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
Javascript面向对象编程
2012/03/18 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
Python中标准模块importlib详解
2017/04/16 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
django-csrf使用和禁用方式
2020/03/13 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
满月酒答谢词
2014/01/14 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
感恩教育活动总结
2014/05/05 职场文书
三好学生竞选稿
2015/11/21 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
Python合并pdf文件的工具
2021/07/01 Python
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
Hive日期格式转换方法总结
2022/06/25 数据库