身份证校验,绝对严格

身份证校验,绝对严格

function checkIdCard(idcard) {
  let ereg;
  // const Errors = new Array(
  //   '验证通过',
  //   '身份证号码位数不对',
  //   '身份证号码出生日期超出范围或含有非法字符',
  //   '身份证号码校验错误',
  //   '身份证地区非法'
  // );
  const area = {
    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: '国外'
  };

  let Y;
  let JYM;
  let S;
  let M;
  let idcardArray = new Array();
  idcardArray = idcard.split('');
  // 地区检验
  if (area[parseInt(idcard.substr(0, 2), 10)] === null) {
    return false;
  }
  // 身份号码位数及格式检验
  switch (idcard.length) {
    case 16:
      if ((parseInt(idcard.substr(6, 2), 10) + 1900) % 4 === 0 || ((parseInt(idcard.substr(6, 2), 10) + 1900) % 100 === 0 && (parseInt(idcard.substr(6, 2), 10) + 1900) % 4 === 0)) {
        // 测试出生日期的合法性
        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;
      } else {
       // 测试出生日期的合法性
        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;
      }
      if (ereg.test(idcard)) {
        return true;
      }
      return false;

    case 18:
     // 18位身份号码检测
     // 出生日期的合法性检查
     // 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
     // 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
      if (parseInt(idcard.substr(6, 4), 10) % 4 === 0 || (parseInt(idcard.substr(6, 4), 10) % 100 === 0 && parseInt(idcard.substr(6, 4), 10) % 4 === 0)) {
        // 闰年出生日期的合法性正则表达式
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
      } else {
        // 平年出生日期的合法性正则表达式
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
      }
      // 测试出生日期的合法性
      if (ereg.test(idcard)) {
        // 计算校验位
        S = (parseInt(idcardArray[0], 10) + parseInt(idcardArray[10], 10)) * 7
        + (parseInt(idcardArray[1], 10) + parseInt(idcardArray[11], 10)) * 9
        + (parseInt(idcardArray[2], 10) + parseInt(idcardArray[12], 10)) * 10
        + (parseInt(idcardArray[3], 10) + parseInt(idcardArray[13], 10)) * 5
        + (parseInt(idcardArray[4], 10) + parseInt(idcardArray[14], 10)) * 8
        + (parseInt(idcardArray[5], 10) + parseInt(idcardArray[15], 10)) * 4
        + (parseInt(idcardArray[6], 10) + parseInt(idcardArray[16], 10)) * 2
        + parseInt(idcardArray[7], 10) * 1
        + parseInt(idcardArray[8], 10) * 6
        + parseInt(idcardArray[9], 10) * 3;
        Y = S % 11;
        M = 'F';
        JYM = '10X98765432';
        // 判断校验位
        M = JYM.substr(Y, 1);
        if (M === idcardArray[17]) {
        // 检测ID的校验位
          return true;
        }
        return false;
      }
      return false;
    default:
      return false;
  }
}

 

posted on 2016-08-01 17:01  柔光  阅读(337)  评论(0编辑  收藏  举报

导航