js15位或18位身份证校验

小弟加急写的,难免有错误,请诸位发现问题的及时指正。感谢!!!

/** 身份证验证 */
export function regIdentityCard(idCardNo) {
  if (!idCardNo || (idCardNo.length !== 15 && idCardNo.length !== 18)) {
    return false;
  }

  //检查省份
  if (!checkProvince(idCardNo)) {
    return false;
  }

  if (idCardNo.length === 18) {
    /**
     * 6位地区码 \d{6}
     * 年 (18|19|([23]\d))\d{2}
     * 月 ((0[1-9])|(10|11|12))
     * 日 (([0-2][1-9])|10|20|30|31)
     * 3位顺序码 \d{3}
     * 校验码 [0-9Xx]
     */
    const regCode = /^\d{15}|(\d{6}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx])$/;
    if (regCode.test(idCardNo)) {
      // 前17位每项的系数
      const coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      // 除11取余的结果对应的校验位(最后一位)的值
      const checkDigitMap = [
        '1',
        '0',
        'X',
        '9',
        '8',
        '7',
        '6',
        '5',
        '4',
        '3',
        '2'
      ];

      let sum = 0; // 总和
      for (let i = 0; i < 17; i++) {
        sum += idCardNo[i] * coefficient[i];
      }

      return idCardNo[17] === checkDigitMap[sum % 11];
    }

    return false;
  } else {
    // 15位身份证
    const regCode = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
    return regCode.test(idCardNo);
  }
}

/** 校验省份 */
function checkProvince(idCardNo) {
  const CITY = {
    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: '国外'
  };
  return !!CITY[idCardNo.substr(0, 2)];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值