公民身份证校验规则最新最全最严格(包含最后一位校验码校验)

17 篇文章 0 订阅
13 篇文章 1 订阅

公民身份证校验规则最新最全最严格(包含最后一位校验码校验)

身份证号前两位为省级行政区划
11: “北京”,
12: “天津”
13: “河北”,
14: “山西”,
15: “内蒙古”,

正则表达:1[1-5]

21: “辽宁”,
22: “吉林”,
23: “黑龙江”,

正则表达:2[1-3]

31: “上海”,
32: “江苏”,
33: “浙江”,
34: “安徽”,
35: “福建”,
36: “江西”,
37: “山东”,

正则表达:3[1-7]

41: “河南”,
42: “湖北”,
43: “湖南”,
44: “广东”,
45: “广西”,
46: “海南”,

正则表达:4[1-6]

50: “重庆”,
51: “四川”,
52: “贵州”,
53: “云南”,
54: “西藏”,

正则表达:5[0-4]

61: “陕西”,
62: “甘肃”,
63: “青海”,
64: “宁夏”,
65: “新疆”,

正则表达:6[1-5]

省级部分合并正则表达:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]

前六位为县级行政区划,为省级代码加4位数字
正则表达:([16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}

日期部分4位年
4位年,从1900到2099:(19|20)\d{2}

月和日期
0469 4、6、9月有30天
11(0[1-9]|[12][0-9]|30) 11月有30天

上面两行合并后表达为:(?:0[469]|11)(?:0[1-9]|[12][0-9]|30)

013578 1、3、5、7、8月有31天
102 10月和12月有31天

上面两行合并后表达为:(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])

02(0[1-9]|[12][0-9]) 2月最多29天,但约有3/4的时候是28天,这里没办法判断不润年的情况

合并月份和日期部分如下:(?😦?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))

后四位,不对校验位进行检查(太复杂,正则不可能实现)\d{3}[\dXx]

后续有具体校验方法!

完整的身份证正则表达式
(?:[16][1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4])\d{4}(?:19|20)\d{2}(?😦?:0[469]|11)(?:0[1-9]|[12][0-9]|30)|(?:0[13578]|1[02])(?:0[1-9]|[12][0-9]|3[01])|02(?:0[1-9]|[12][0-9]))\d{3}[\dXx])

    validID(rule, value, callback) {
      // 身份证验证
      // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
      //   let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
      let reg = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/;
      log.info("------>校验规则是啥", reg);

      if (reg.test(value)) {
        let validResult = this.gitNumberValid(value);
        log.info("我是校验函数里面的获取到的值validResult", validResult);
        if (validResult) {
          this.idStatus = true;
          this.go(value.length);
          callback();
        } else {
          this.idStatus = false;
          callback(new Error("身份证号码不正确"));
        }
      } else {
        this.idStatus = false;
        callback(new Error("身份证号码不正确"));
      }
    },

自动根据身份证号获取生日,性别,年龄(住址太复杂就暂时不写了,理论也能实现)

    go(val) {
      // 实现自动生成生日,性别,年龄
      let iden = this.formShuRuMessage.number;
      let sex = null;
      let birth = null;
      let myDate = new Date();
      let month = myDate.getMonth() + 1;
      let day = myDate.getDate();
      let age = 0;

      if (val === 18) {
        age = myDate.getFullYear() - iden.substring(6, 10) - 1;
        sex = iden.substring(16, 17);
        birth =
          iden.substring(6, 10) +
          "-" +
          iden.substring(10, 12) +
          "-" +
          iden.substring(12, 14);
        if (
          iden.substring(10, 12) < month ||
          (iden.substring(10, 12) == month && iden.substring(12, 14) <= day)
        )
          age++;
      }
      if (val === 15) {
        age = myDate.getFullYear() - iden.substring(6, 8) - 1901;
        sex = iden.substring(13, 14);
        birth =
          "19" +
          iden.substring(6, 8) +
          "-" +
          iden.substring(8, 10) +
          "-" +
          iden.substring(10, 12);
        if (
          iden.substring(8, 10) < month ||
          (iden.substring(8, 10) == month && iden.substring(10, 12) <= day)
        )
          age++;
      }

      if (sex % 2 === 0) sex = "女";
      else sex = "男";
      this.formShuRuMessage.sex = sex;
      this.formShuRuMessage.age = age;
      this.formShuRuMessage.birthday = birth;
      // this.formShuRuMessage.birthplace = this.area[iden.substring(0,2)];
      log.info(
        this.formShuRuMessage,
        this.formShuRuMessage.sex,
        this.formShuRuMessage.age,
        this.formShuRuMessage.birthday
      );
    },

获取最后一位校验码

    //获取身份证最后一步校验码
    gitNumberValid(val) {
      log.info("------->>>传过来的身份证号", val);
      let idArry = val.split("");
      log.info("------->>>传过来的身份证号分割结果==>", idArry);
      let A1 = idArry[0] * 7;
      let A2 = idArry[1] * 9;
      let A3 = idArry[2] * 10;
      let A4 = idArry[3] * 5;
      let A5 = idArry[4] * 8;
      let A6 = idArry[5] * 4;
      let A7 = idArry[6] * 2;
      let A8 = idArry[7] * 1;
      let A9 = idArry[8] * 6;
      let A10 = idArry[9] * 3;
      let A11 = idArry[10] * 7;
      let A12 = idArry[11] * 9;
      let A13 = idArry[12] * 10;
      let A14 = idArry[13] * 5;
      let A15 = idArry[14] * 8;
      let A16 = idArry[15] * 4;
      let A17 = idArry[16] * 2;
      let Num = parseInt(
        A1 +
          A2 +
          A3 +
          A4 +
          A5 +
          A6 +
          A7 +
          A8 +
          A9 +
          A10 +
          A11 +
          A12 +
          A13 +
          A14 +
          A15 +
          A16 +
          A17
      );
      log.info("----------> 计算出来的身份证数据总和Num", Num);
      let yuNum = Num % 11;
      log.info("----------> 计算出来的身份证取余yuNum", yuNum);
      let validNum = "";
      switch (yuNum) {
        case 0:
          log.info("---0--->上面传过来的余数yuNum", yuNum);
          validNum = 1;
          break;
        case 1:
          log.info("---1--->上面传过来的余数yuNum", yuNum);
          validNum = 0;
          break;
        case 2:
          log.info("---2--->上面传过来的余数yuNum", yuNum);
          validNum = X;
          break;
        case 3:
          log.info("---3--->上面传过来的余数yuNum", yuNum);
          validNum = 9;
          break;
        case 4:
          log.info("---4--->上面传过来的余数yuNum", yuNum);
          validNum = 8;
          break;
        case 5:
          log.info("---5--->上面传过来的余数yuNum", yuNum);
          validNum = 7;
          break;
        case 6:
          log.info("---6--->上面传过来的余数yuNum", yuNum);
          validNum = 6;
          break;
        case 7:
          log.info("---7--->上面传过来的余数yuNum", yuNum);
          validNum = 5;
          break;
        case 8:
          log.info("---8--->上面传过来的余数yuNum", yuNum);
          validNum = 4;
          break;
        case 9:
          log.info("---9--->上面传过来的余数yuNum", yuNum);
          validNum = 3;
          break;
        case 10:
          log.info("---10--->上面传过来的余数yuNum", yuNum);
          validNum = 2;
          break;

        default:
          log.info("---不该出现这个打印!!!--->上面传过来的余数yuNum", yuNum);
          this.$message({
            message: "您输入身份证号不对",
            type: "warning",
            offset: this.hight,
          });
          break;
      }
      let result;
      if (validNum === parseInt(idArry[17])) {
        log.info("比对最后一位校验码结果===>", validNum, idArry[17]);
        result = true;
      } else {
        log.info("比对最后一位校验码结果===>", validNum, idArry[17]);
        result = false;
      }
      log.info("--------->>>检验结果", result);
      return result;
    },
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值