js校驗15位/18位身份證件號(地區、生日、性別)


 

var aCity = {
 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 : "國外"
}

/**
 * 校驗身份證號碼(15位/18位)
 */
function isIdCardNo(num) {
 num = num.toUpperCase();
 //身份證號碼爲15位或者18位,15位時全爲數字,18位前17位爲數字,最後一位是校驗位,可能爲數字或字符X。
 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
  alert('身份證號長度不對,或者號碼不符合規定!15位號碼應全爲數字,18位號碼末位可以爲數字或X。');
  return false;
 }
 //下面分別分析出生日期和校驗位
 var len = num.length;
 if (len == 15) {
  re = new RegExp(/^(\d{2})(\d{4})(\d{2})(\d{2})(\d{2})(\d{3})$/);
  var arrSplit = num.match(re);
  if (aCity[parseInt(arrSplit[1])] == null) {
   return "15位身份證的地區非法";
  }
  //檢查生日日期是否正確
  var dtmBirth = new Date("19" + arrSplit[3] + "/" + arrSplit[4] + "/" + arrSplit[5]);
  var bGoodDay;
  bGoodDay = (dtmBirth.getYear() == Number(arrSplit[3])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[4])) && (dtmBirth.getDate() == Number(arrSplit[5]));
  if (!bGoodDay) {
   alert('15位身份證的生日非法');
   return false;
  }
 }
 if (len == 18) {
  re = new RegExp(/^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
  var arrSplit = num.match(re);
  if (aCity[parseInt(arrSplit[1])] == null) {
   return "18位身份證的地區非法";
  }
  //檢查生日日期是否正確
  var dtmBirth = new Date(arrSplit[3] + "/" + arrSplit[4] + "/" + arrSplit[5]);
  var bGoodDay;
  bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[3])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[4])) && (dtmBirth.getDate() == Number(arrSplit[5]));
  if (!bGoodDay) {
   alert('18位身份證的生日非法');
   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;
}

/**
 * 18身份證號碼 獲取地區、出生年月、性別
 */
function cidInfo(sId) {
 return aCity[parseInt(sId.substr(0, 2))] + "," + sBirthday + "," + (sId.substr(16, 1) % 2 ? "男" : "女")
}

發佈了18 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章