首页 新闻 会员 周边 捐助

身份证的正则表达式

0
悬赏园豆:10 [已解决问题] 解决于 2019-07-31 09:23

如何限制input输入框只能输入正确的身份证号码,例如只能有18位和15位且不能超过十八位,第十八位还能出现字母X,其余字母不能出现。

西装暴徒老为的主页 西装暴徒老为 | 初学一级 | 园豆:31
提问于:2019-07-26 16:11
< >
分享
最佳答案
1

/**

  • 匹配身份证号码
    /
    function isIdCardNo(num)
    {
    if(num==null || num=="")
    {
    alert("请输入身份证号码!");
    return false;
    }
    //去除字符串收尾空格
    num = num.replace(/\s/ig,'');
    //大小写转换,18位身份证最后一位可能为字母,统一转换为大写,方便验证
    num = num.toUpperCase();
    //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
    if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num)))
    {
    alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。');
    return false;
    }
    //下面分别分析出生日期和校验位
    var len, re;
    len = num.length;
    if (len == 15)
    {
    re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
    var arrSplit = num.match(re);
    //检查生日日期是否正确
    var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
    var bGoodDay;
    // 15位身份证无前两位,无需考虑千年虫问题
    bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
    if (!bGoodDay)
    {
    alert('输入的身份证号里出生日期不对!');
    return false;
    }else
    {
    //将15位身份证转成18位
    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    var nTemp = 0, i;
    num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
    for(i = 0; i < 17; i ++)
    {
    nTemp += num.substr(i, 1)
    arrInt[i];
    }
    num += arrCh[nTemp % 11];
    return true;
    }
    }
    if (len == 18)
    {
    re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
    var arrSplit = num.match(re);

     //检查生日日期是否正确
     var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
     var bGoodDay;
     // 这里用getFullYear()获取年份,避免千年虫问题
     bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
     if (!bGoodDay)
     {
         alert('输入的身份证号里出生日期不对!');
         return false;
     }else
     {
         //检验18位身份证的校验码是否正确。
         var valnum;
         var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
         var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
         var nTemp = 0, i;
         for(i = 0; i < 17; i ++)
         {
             nTemp += num.substr(i, 1) * arrInt[i];
         }
         valnum = arrCh[nTemp % 11];
         if (valnum != num.substr(17, 1))
         {
             alert('18位身份证不合法!');
             return false;
         }
         return true;
     }

    }
    return false;
    }

收获园豆:10
^keepHungry$ | 小虾三级 |园豆:516 | 2019-07-26 17:27
其他回答(4)
0

如果只是验证你说的这几项,那应该很简单。如果呀验证日期格式以及日期范围是否正确,那就比较难。帮你搜索了一篇参考文章:浅谈正则表达式验证身份证号码

会长 | 园豆:12463 (专家六级) | 2019-07-26 16:16

好的谢谢我去看看

支持(1) 反对(0) 西装暴徒老为 | 园豆:31 (初学一级) | 2019-07-26 16:20
0
ycyzharry | 园豆:25683 (高人七级) | 2019-07-26 22:54
0

public static bool IsIdCard(string idCard)
{
switch (idCard.Length)
{
case 15:
return Regex.IsMatch(idCard, @"^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$");
case 18:
return Regex.IsMatch(idCard, @"^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[A-Z])$", RegexOptions.IgnoreCase);
default:
return false;
}
}

马玉溁 | 园豆:27 (初学一级) | 2019-07-28 17:40
0

只是一个正则表达式搞不定,就添加一些代码搞定,

快乐的欧阳天美1114 | 园豆:4004 (老鸟四级) | 2019-07-29 08:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册