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 trim() 功能源代码
Feb 14 Javascript
js判断屏幕分辨率的代码
Jul 16 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
javascript 中Cookie读、写与删除操作
Mar 29 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
深入解析Vue 组件命名那些事
Jul 18 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
微信小程序中添加客服按钮contact-button功能
Apr 27 Javascript
ES6新增的数组知识实例小结
May 23 Javascript
Angular+ionic实现折叠展开效果的示例代码
Jul 29 Javascript
Node.js fs模块原理及常见用途
Oct 22 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设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
详解ES6中的let命令
2020/04/05 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
JavaScript this绑定过程深入详解
2018/12/07 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
python 数据加密代码
2008/12/24 Python
python中黄金分割法实现方法
2015/05/06 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
详解python编译器和解释器的区别
2019/06/24 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
python中format函数如何使用
2020/06/22 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
详解python UDP 编程
2020/08/24 Python
Python编写单元测试代码实例
2020/09/10 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
挂靠协议书范本
2014/04/22 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
学习雷锋标语
2014/06/25 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers