Created
July 31, 2019 07:20
-
-
Save codeyu/c1cc929d4faf2dfd658eb72de23b13c8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
匹配身份证号码 | |
**/ | |
function isIdCardNo(num) { | |
if (num == null || num == "") { | |
alert("请输入身份证号码!"); | |
return false; | |
} | |
//去除字符串收尾空格 | |
num = num.replace(/\s/ig, ''); | |
//大小写转换,18位身份证最后一位可能为字母,统一转换为大写,方便验证 | |
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; | |
} | |
//下面分别分析出生日期和校验位 | |
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; | |
// 15位身份证无前两位,无需考虑千年虫问题 | |
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位 | |
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; | |
// 这里用getFullYear()获取年份,避免千年虫问题 | |
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); | |
if (!bGoodDay) { | |
alert('输入的身份证号里出生日期不对!'); | |
return false; | |
} else { | |
//检验18位身份证的校验码是否正确。 | |
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位身份证不合法!'); | |
return false; | |
} | |
return true; | |
} | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment