第一个校验来自于学长:
function isIdCardNo(num) {
// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
num = num.toUpperCase();
// 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
alert("输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。");
return false;
}
// 下面分别分析出生日期和校验位
var len;
var 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;
num = num.substr(0, 6) + "19" + num.substr(6, num.length - 6);
for(var i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
num += arrCh[nTemp % 11];
return true;
}
}
// 身份证ID为18为的时候
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("输入的身份证号里出生日期不对!");
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;
for(var 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;
}
第二个校验来自于项目中:
function gf_check_identity(as_identity) {
var ls_identity_no;
var ls_year,ls_month,ls_day,ls_date;
var ls_today;
var ll_year;
var ll_identity_no_len;
ls_identity_no = as_identity;
ls_today = new Date();
ls_current = ls_today.getYear()+'/'+(ls_today.getMonth()+1)+'/'+ls_today.getDate();
ll_identity_no_len=ls_identity_no.length;
if (/^\s*$/.test(ls_identity_no) ) {
alert("身份证号码不能为空!");
return false;
}
else if (!(ll_identity_no_len==15 || ll_identity_no_len == 18))
{
alert("身份证号码位数不正确,请检查输入情况!");
return false;
}
//alert('length==' + ll_identity_no_len);
if (ll_identity_no_len == 15) { //身份证为 15 处理, 认为15位的年 = 19**
// alert("YYYYYYYYYYYYYY");
ls_year = ls_identity_no.substring(6,8);
ls_month = ls_identity_no.substring(8,10);
ls_day = ls_identity_no.substring(10,12);
ls_year = '19' + ls_year//year is only 20 century
ls_date = ls_year +'/' + ls_month +'/' + ls_day;
}
else {
// alert("XXXXXXXXXXXXX");
ls_year = ls_identity_no.substring(6,10);
if (!(ls_year.substring(0,2) == '19' || ls_year.substring(0,2)== '20')){
alert("身份证号码中的出生年份不正确, 请您重新输入!");
return false;
}
ls_month = ls_identity_no.substring(10,12);
ls_day = ls_identity_no.substring(12,14);
ls_date = ls_year +'/' + ls_month +'/' + ls_day
}
//alert('ls_month==' + ls_month);
if (ls_month > '12') {
alert("身份证号码中的出生月份不能大于12, 请您重新输入 ");
return false;
}
else if (ls_month <= '00') {
alert("身份证号码中的出生月份不能小于01, 请您重新输入 ");
return false;
}
if (ls_day <= '00') {
alert("身份证号码的出生日小于01, 请您重新输入 ");
return false;
}
switch (ls_month) {
case '01'://大月的处理
case '03':
case '05':
case '07':
case '08':
case '10':
case '12':
if (ls_day > '31') {
alert("身份证号码的出生日大于31, 请您重新输入");
return false;
}
break;
case '04': //小月的处理
case '06':
case '09':
case '11':
if (ls_day > '30' ) {
alert("身份证号码的出生日大于30(本月无31日), 请您重新输入");
return false;
}
break;
case '02': //平年和闰年的处理
ll_year = parseInt(ls_year);
if ((ll_year%4== 0 && ll_year%100!=0) || ll_year%400==0) { //闰年,二月份不能多于29天
if (ls_day > '29') {
alert("闰年的二月份没有" + ls_day + "日,请重新输入出生日期");
return fasle;
}
}
else {//平年二月份不能大于28天
if (ls_day > '28') {
alert("平年的二月份没有" + ls_day + "日,请重新输入出生日期");
return false;
}
}
}
if (Date.parse(ls_date) > Date.parse(ls_current)) {
alert("身份证号码的出生日期小于登记日期,不合理请您重新输入");
return false;
}
if (ll_identity_no_len == 18) {//18位的校验码的检验
var lastS = ls_identity_no.substring(ls_identity_no.length-1,ls_identity_no.length);
var code = getVertifyCode(ls_identity_no.substring(0,17));
if (lastS!=code)
{
alert("身份证检验码不正确,请您重新输入");
return false;
}
}
return true;
}
/**
取得18位身份证号码的检验码,入参为身份证号码前17位
*/
function getVertifyCode(identify) {
var factors = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4, 2];
var codes = ['1','0','X','9','8','7','6','5','4','3','2'];
var sum = 0;
var temp = 0;
for (var j=0; j<factors.length; j++)
{
temp = parseInt(identify.charAt(j)+"")*factors[j];
sum += temp;
}
var re = sum%11;
return codes[re];
}
第一种方式校验身份证中的日期采用的正则表达式,第二种方式用的JS判断的。