@十个太阳 需要的万能表单身份证正则校验方法
327
8

@十个太阳 需要的万能表单身份证正则校验方法



 方法处理如下:

以下是隐藏的内容,需要加入圈子正式会员才能查看。你可以任选其中一种方式:
加入圈子
************************************



2
赏礼
赏钱
收藏
点击回复
      全部留言
  • 8
  • 袁冬 普通粉丝 消费:160.85元 2020-10-21 08:34 08:346楼
0 赏钱 赏礼回复
  • 阿赖耶识 程序开发者 消费:24.43元 2020-03-23 09:04 09:046楼

    正则表达式分析:

    /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}([0-9]|x|X)$/;

    0903 3059

    ^开头 

    前六位代表地区号:

    [1-9][0-9]{5}  第一位非0 限定在1-9任意数,后五位限定在0到9

    第7位到到10位生日年号:

    (19|20)[0-9]{2} 新版的没必要判断18xx年的,都是19xx年到 20xx 后出生的,所以前两位限定在19、20,后面两位0-9确实有点粗糙[0-9]{2},毕竟还没有202x后的,但是为了兼容19xx,所以直接限定在1-9里,否则需要更多的判断,太复杂

    第10位到14位生日月日号:

    ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))

    按照月大月小来判定生日,独立出二月最大29号的判断

    后四位编码号:

    [0-9]{3}([0-9]|x|X)  最后一位有x的判断

    $正则结束


    此正则虽然不是非常严谨,但是一般情况下绝对够用了,至少一般不知道的编码规则的,乱填不出来,如果觉得确实不够严谨,那就去找更复杂的正则替换即可,总之判断变量用atc_变量的方式就可以获取对应dom元素


    image.png

    十个太阳 消费:6.02元 华为 2020-03-23 09:23
    感谢
0 赏钱 赏礼回复
  • 十个太阳 普通粉丝 消费:6.02元 2020-03-23 00:53 00:536楼
    <script>
    function validateIdCard(obj)
    {
    var aCity={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:"国外"};
      var iSum = 0;
    //var info = "";
    var strIDno = obj;
    var idCardLength = strIDno.length;
    if(!/^\d{17}(\d|x)$/i.test(strIDno)&&!/^\d{15}$/i.test(strIDno))
            return 1; //非法身份证号

    if(aCity[parseInt(strIDno.substr(0,2))]==null)
    return 2;// 非法地区

      // 15位身份证转换为18位
    if (idCardLength==15)
    {
        sBirthday = "19" + strIDno.substr(6,2) + "-" + Number(strIDno.substr(8,2)) + "-" + Number(strIDno.substr(10,2));
      var d = new Date(sBirthday.replace(/-/g,"/"))
      var dd = d.getFullYear().toString() + "-" + (d.getMonth()+1) + "-" + d.getDate();
      if(sBirthday != dd)
                    return 3; //非法生日
                  strIDno=strIDno.substring(0,6)+"19"+strIDno.substring(6,15);
                  strIDno=strIDno+GetVerifyBit(strIDno);
    }

           // 判断是否大于2078年,小于1900年
           var year =strIDno.substring(6,10);
           if (year<1900 || year>2078 )
               return 3;//非法生日

        //18位身份证处理

       //在后面的运算中x相当于数字10,所以转换成a
        strIDno = strIDno.replace(/x$/i,"a");

      sBirthday=strIDno.substr(6,4)+"-"+Number(strIDno.substr(10,2))+"-"+Number(strIDno.substr(12,2));
      var d = new Date(sBirthday.replace(/-/g,"/"))
      if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))
                    return 3; //非法生日
        // 身份证编码规范验证
      for(var i = 17;i>=0;i --)
       iSum += (Math.pow(2,i) % 11) * parseInt(strIDno.charAt(17 - i),11);
      if(iSum%11!=1)
                    return 1;// 非法身份证号

       // 判断是否屏蔽身份证
        var words = new Array();
        words = new Array("11111119111111111","12121219121212121");

        for(var k=0;k<words.length;k++){
            if (strIDno.indexOf(words[k])!=-1){
                return 1;
            }
        }

    return 0;
    }

    function checkfjb(fromyz){

        var tt=document.getElementById('atc_idcard')
       if(tt.value==""){
    alert("系统提醒:请输入18位身份证号");
    tt.focus();
    return false;
    }

        if(tt.value!=""){

    if(validateIdCard(tt.value)){
    alert("系统验证:身份证号码不正确");
    tt.focus();
    return false;
    }
    }

    }
    function upfile(url,name,size,ty){
    document.getElementById(ty).value=url;
    }
    </script>
    阿赖耶识 消费:24.43元 小米 2020-03-23 08:03
    你发的这些,已经全部在正则表达式里了,当然不是简单的判断位数
0 赏钱 赏礼回复
  • 啡巅 普通粉丝 消费:1381.19元 2020-03-23 00:21 00:216楼
    十八位:^[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]$

    总:



    (^[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]$)
0 赏钱 赏礼回复
  • 十个太阳 普通粉丝 消费:6.02元 2020-03-23 00:00 00:006楼
    @阿赖耶识
0 赏钱 赏礼回复
  • 十个太阳 普通粉丝 消费:6.02元 2020-03-22 23:50 23:506楼
    谢谢朋友的答复,这种方法只是粗略的判断18位,还是不能按照身份证的编码规则进行判断,我这里有一段代码是以前我用在V7程序上的,但现在的X1系统就不能用了,我发给你看下,能不能用?再次感谢。。
0 赏钱 赏礼回复
更多回复
      你可能感兴趣的主题
恢复多功能编辑器
  • 3 1
  • 神盾SOHO
        圈内贴子3539
    • 圈子成员262
    本圈子内的新贴

    推荐内容
    扫一扫访问手机版
    请选择要切换的马甲:

     
    网页即时交流
    QQ咨询
    咨询热线
    020-28998648