//证件验证的方法
var vcity = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50', '51', '52', '53', '54', '61', '62', '63', '64', '65', '71', '81', '91']
//检查号码是否符合规范,包括长度,类型
var isCardNo = function (card) {
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
return reg.test(card);
};
//取身份证前两位,校验省份
var checkProvince = function (card) {
var province = card.substr(0, 2);
return vcity.indexOf(province) >= 0;
};
//检查生日是否正确
var checkBirthdayId = function (card) {
var len = card.length;
var ereg;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if (len == '15') {
if ((parseInt(card.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(card.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(card.substr(6, 2)) + 1900) % 4 == 0 )) {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
}
if (ereg.test(card)) {
return '19' + card.substr(6, 2) + '-' + card.substr(8, 2) + '-' + card.substr(10, 2);
} else {
return false;
}
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
else if (len == '18') {
if (parseInt(card.substr(6, 4)) % 4 == 0 || (parseInt(card.substr(6, 4)) % 100 == 0 && parseInt(card.substr(6, 4)) % 4 == 0 )) {
ereg = /^[1-9][0-9]{5}(20|19)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][0-9]{5}(20|19)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
}
if (ereg.test(card)) {
return card.substr(6, 4) + '-' + card.substr(10, 2) + '-' + card.substr(12, 2);
} else {
return false;
}
} else {
return false;
}
};
//检查性别
var checkSex = function (card) {
var sexShow;
if (card.length == '15') {
sexShow = card.slice(14, 15) % 2 ? '1' : '2';
return sexShow;
}
else if (card.length == '18') {
sexShow = card.slice(16, 17) % 2 ? '1' : '2';
return sexShow;
} else {
return false;
}
};
//校验位的检测
var checkParity = function (card) {
//15位转18位
card = changeFivteenToEighteen(card);
var len = card.length;
if (len == '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 cardTemp = 0, i, valnum;
for (i = 0; i < 17; i++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
return valnum == card.substr(17, 1);
}
return false;
};
//15位转18位身份证号
var changeFivteenToEighteen = function (card) {
if (card.length == '15') {
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 cardTemp = 0, i;
card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
for (i = 0; i < 17; i++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
card += arrCh[cardTemp % 11];
return card;
}
return card;
};
function validIdCard(value) {
return (isCardNo(value)&&checkProvince(value)&&checkBirthdayId(value)&&checkSex(value)&&checkParity(value));
}