javascript版本的
身份证号码的合法性校验
/**
* 检验身份证号码
* 15位:ddddddyymmddxxp
* 18位:ddddddyyyymmddxxxy
* @param cardNum 身份证号码 string
* @param needAlertError 是否需要弹出错误提示信息
* @return true/false
*/
function checkIDCardNumber(cardNum, needAlertError) {
//默认不弹出错误提示信息
needAlertError = !!needAlertError || false;
if(typeof cardNum != 'string') {
if(needAlertError) {
alert("参数cardNum格式错误");
}
return false;
}
//身份证号码长度为15位或18位
if(cardNum.length!=15 && cardNum.length!=18) {
if(needAlertError) {
alert("身份证号码位数不对");
}
return false;
}
//15位身份证号码全为数字,18位也全为数字或17位数字,并以字符X结尾
if(!/^\d{15}$|(^\d{17}[0-9Xx]$)/.test(cardNum)) {
if(needAlertError) {
alert("身份证号码含有非法字符");
}
return false;
}
// 地址编码
var province = {
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:"香港",82:"澳门",91:"国外"};
if(!province[cardNum.substring(0, 2)]) {
if(needAlertError) {
alert("身份证号码地区非法");
}
return false;
}
//出生日期
var birthday = cardNum.length==15 ? ("19" + cardNum.substring(6, 12)) : cardNum.substring(6, 14);
if(!/(19)|(20)\d{6}/.test(birthday)) {
if(needAlertError) {
alert("身份证号码出生日期超出范围或格式错误");
}
return false;
}
var year = parseInt(birthday.substring(0, 4));
var month = parseInt(birthday.substring(4, 6)) - 1;
var day = parseInt(birthday.substring(6));
var newBirthday = new Date(year, month, day);
var formatedBirthday = "" + newBirthday.getFullYear();
formatedBirthday += (newBirthday.getMonth()<9 ? "0" : "") + (newBirthday.getMonth() + 1);
formatedBirthday += (newBirthday.getDate()<10 ? "0" : "") + newBirthday.getDate();
//身份证中如包含如下格式的日期将不能通过校验:20150230、20150735
if(birthday != formatedBirthday) {
if(needAlertError) {
alert("身份证号码出生日期超出范围或格式错误");
}
return false;
}
//校验位 ∑(ai×Wi)(mod 11)
if(cardNum.length == 18) {
//加权因子
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
//校验位
var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
var sum = 0;
for (var i = 0; i < 17; i++)
{
sum += cardNum[i] * factor[i];
}
if(parity[sum % 11] != cardNum[17]){
if(needAlertError) {
alert("身份证号码校验位错误");
}
return false;
}
}
return true;
}