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 相关文章推荐
模仿jQuery each函数的链式调用
Jul 22 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
offsetHeight在OnLoad中获取为0的现象
Jul 22 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
JS扩展方法实例分析
Apr 15 Javascript
理解javascript中的严格模式
Feb 01 Javascript
Javascript实现base64的加密解密方法示例
Jun 27 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 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
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php图片上传类 附调用方法
2016/05/15 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
js中return false(阻止)的用法
2013/08/14 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
用pycharm开发django项目示例代码
2018/10/24 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
亿企通软件测试面试题
2012/04/10 面试题
Java程序员综合测试题
2014/04/25 面试题
单位委托书怎么写
2014/08/02 职场文书
个人作风建设总结
2014/10/23 职场文书
城南旧事观后感
2015/06/11 职场文书
公司备用金管理制度
2015/08/04 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
MySQL为id选择合适的数据类型
2021/06/07 MySQL
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers