精準實現身份證號碼格式校驗程式碼例項

admin發表於2017-03-26

分享一段程式碼例項,它實現了身份證號碼格式驗證的功能。

實現類似功能的程式碼有很多,但是下面要分享的具有比較高的精準性。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
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: "國外 "
},
//15位身份證
idcard_15_regexp = /^[1-9]\d{5}\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}$/i,
//18位身份證
idcard_18_regexp = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
 
function validate(str) {
  var factor, parity, sum = 0,
    ai, wi, i;
  if (!idcard_15_regexp.test(str) && !idcard_18_regexp.test(str)) {
    return false;
  } else if (!province[str.substr(0, 2)]) {
    return false;
  } else {
    //18位身份證需要驗證最後一位校驗位
    if (str.length === 18) {
      //∑(ai×Wi)(mod 11)
      //加權因子
      factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      //校驗位
      parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
      for (i = 0; i < factor.length; i++) {
        sum += parseInt(str[i]) * factor[i];
      }
      if (parity[sum % parity.length] + '' !== str[17]) {
        return false;
      }
    }
    return true;
  }
}
console.log(validate("371328198308031035"));

相關文章