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 相关文章推荐
IE下Ajax缓存问题的快速解决方法(get方式)
Jan 09 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 Javascript
jQuery操作表单常用控件方法小结
Mar 23 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
javaScript中Math()函数注意事项
Jun 18 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
JS使用setInterval实现的简单计时器功能示例
Apr 19 Javascript
浅谈node中的cluster集群
Jun 02 Javascript
原生js无缝轮播插件使用详解
Mar 09 Javascript
编写一个javascript元循环求值器的方法
Apr 14 Javascript
JavaScript实现答题评分功能页面
Jun 24 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 简单日历实现代码
2009/10/28 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
node内置调试方法总结
2018/02/22 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
用vue写一个日历
2020/11/02 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
Python中使用PIPE操作Linux管道
2015/02/04 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
护士自我评价
2014/02/01 职场文书
聘用意向书范本
2014/04/01 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书