`

身份证号码校验

阅读更多
第一个校验来自于学长:
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判断的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics