• 身份证号码校验


    根据《新版外国人永久居留身份证适配性改造要点》,公司需要把代码中对身份证的校验进行优化

    就文档内容可以看到需要优化的要点是:
    新版永居证号码以 9 开头 + 受理地区代码+出生日期+顺序码+校验码;(共18位)
    eg:932682198501010017
    既往版本永居证号码 由三位国家和地区代码开头 + 地址码+顺数码+校验码;(共15位)
    eg:KAZ110090123105

    在这里插入图片描述

    // 身份证号码验证
    export function testIdCard(id) {
      // 1 "验证通过!", 0 //校验不通过 // id为身份证号码
      
      // 新 增加新版永居证号码 以9开头再加受理区域
      var format = /^(((([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4})|(([9](([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2])))\d{3}))(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
      var format15Foreign = /^[a-zA-Z]{3}[0-9]{4}[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]{2}$/;
    
      //号码规则校验
      if (!(format.test(id) || format15Foreign.test(id))) {
        return { 'status': 0, 'msg': '身份证号码不合规' };
      }
      //区位码校验
      if (id.length == 18) {
        //出生年月日校验  前正则限制起始年份为1900;
        var year = id.substr(6, 4),//身份证年
          month = id.substr(10, 2),//身份证月
          date = id.substr(12, 2),//身份证日
          time = Date.parse(month + '-' + date + '-' + year),//身份证日期时间戳date
          now_time = Date.parse(new Date()),//当前时间戳
          dates = (new Date(year, month, 0)).getDate();//身份证当月天数
        if (time > now_time || date > dates) {
          return { 'status': 0, 'msg': '出生日期不合规' }
        }
    
        //校验码判断
        var c = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);  //系数
        var b = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); //校验码对照表
        var id_array = id.split("");
        var sum = 0;
        for (var k = 0; k < 17; k++) {
          sum += parseInt(id_array[k]) * parseInt(c[k]);
        }
        if (id_array[17].toUpperCase() != b[sum % 11].toUpperCase()) {
          return { 'status': 0, 'msg': '身份证校验码不合规' }
        }
      }
      return { 'status': 1, 'msg': '校验通过' }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    // 城市代码列表  
     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: "澳门 "
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    // 地址码判断
    ([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}
    
    // 9 开头再加上 地址码判断
    ([9](([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2])))\d{3}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    正则可视化图片转化工具:https://c.runoob.com/front-end/7625/#!flags=&re=%5E(a%7Cb)*%3F%24
    format 正则可视化图片(看不清可以自己用上分链接工具试一下)
    在这里插入图片描述

  • 相关阅读:
    DaoWiki(基于Django)开发笔记 20231114-阿里云mysql外部访问
    服务器漏洞利用
    详解vue3的ref和reactive
    好用的ps滤镜插件Portraiture2024
    金九银十面试跳槽季:且看程序员如何秒变 offer 收割小能手
    Go语言中获取IP
    【R语言简介】
    计算机算法分析与设计(9)---0-1背包问题(含C++代码)
    OpenCV-Python学习(1)—— OpenCV历史与安装
    Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
  • 原文地址:https://blog.csdn.net/weixin_47180815/article/details/134553563