javascript實現的身份證號碼合法性驗證程式碼

antzone發表於2017-03-22

身份證合法性驗證可能在實際應用中較少一些,因為很少需要填寫身份證號碼,這涉及到人的隱私問題,一般在政府網站或者較為大型的網站有使用,儘管這樣,這也是一個需要掌握的技巧或者程式碼積累,下面就是一段能夠實現此功能的程式碼。

程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function checkIdcard(num){ 
  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; 
  } 
  //校驗位按照ISO 7064:1983.MOD 11-2的規定生成,X可以認為是數字10。 
  //下面分別分析出生日期和校驗位 
  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; 
    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, 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; 
    bGoodDay=(dtmBirth.getFullYear()==Number(arrSplit[2]))&&((dtmBirth.getMonth()+1)==Number(arrSplit[3]))&&(dtmBirth.getDate()==Number(arrSplit[4])); 
    if (!bGoodDay){ 
      //alert(dtmBirth.getYear()); 
      //alert(arrSplit[2]); 
      //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, 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位身份證的校驗碼不正確!應該為:' + valnum); 
        return false; 
      } 
      return true; 
    } 
  } 
  return false; 
}

相關文章