2015-11-19 16:30:46 6480次浏览 5条回答 1 悬赏 100 金钱

正则掌握的不太好,自己写不知道怎么写

  • 回答于 2015-11-19 17:31 举报

    写这干啥?不是18位数字就让过?
    还打算验证号码和姓名对的上不?

    1 条回复
    回复于 2015-11-19 18:26 回复

    123456789123456789 这不能算身份证吧。。。

  • 回答于 2015-11-19 18:06 举报

    如果需要 姓名和身份证 严格匹配, 需要从公安系统验证, 一般公司是没这个资质的...

    幸好... 有资格的服务商 提供api, 调用一次 大概三块钱左右;

    如果不用严格匹配... 按身份证数字规则做验证即可. 大概规则 这里给你贴一下

    1. 前6位为行政区划分代码 ( 网上很多数据库数据, 你可以下载来作验证 )

    2. 第7位至14位为出生日期 (使用php函数验证是否是正确日期即可)

    3. 第15位至17位为顺序码 ( 无法验证 )

    4. 第18位为校验码。 (具体验证规则 百度 "身份证最后一位")

    你可以根据以上信息, 进行选择性进行验证

    7 条回复
    回复于 2015-11-19 18:27 回复

    我以前用过一个 不是严格匹配的 验证身份证号类,但是不知道怎么应用的rule里面

    回复于 2015-11-19 21:01 回复

    public function rules() {
        return [
            ...... // other rules
            ['id', 'validateId'],
        ];
    }
    
    public function validateId($attribute, $params) {
        if ($this->hasErrors()) {
            return false;
        }
        if (验证失败) {
            $this->addError('id', 'error tips');
            return false;
        }
        return true;
    }
    
    回复于 2015-11-21 12:35 回复

    现在 改成 这样的了

            ['id_number', 'checkIdNum'],
    

    验证函数:

    public function checkIdNum($attribute,$params){
        //$num = $this->attribute->params;
        $num = $this->id_number;
        echo $num;
        die;
    
        $cin = new CheckIdNum();
        if($cin->checkIdentity($num)){
            return true;
        }else{
            $this->addError($attribute, '请输入正确的身份证号!');
        }
    }
    

    注释:
    $cin->checkIdentity($num) 这个是个bool值,

    我这种写法 没效果 不能验证

    回复于 2015-11-21 15:57 回复

            ['id_number', function ($attribute, $params){
                $cin = new CheckIdNum();
                if($cin->checkIdentity($this->id_number)){
                    return true;
                }else{
                    $this->addError($attribute, '请输入正确的身份证号!');
                }
            }],
    
    回复于 2015-11-21 15:59 回复

    然而 还是没生效

    回复于 2015-11-21 16:28 回复

    checkIdNum的检查函数 或者 你后来改成的匿名函数 是否有执行到

    回复于 2015-11-23 09:15 回复

    应该是没有执行,我再去检查一下。

    , 觉得很赞
  • 回答于 2015-11-20 00:32 举报

    实在想验证也可以自己写一个啊,model层或者components里面写个静态方法就好了

    有时候自己做轮子比找还快

  • 回答于 2015-11-20 10:10 举报

    再rule里面写个正则验证就可以了,身份证的正则表达式,网上搜一搜就来了

  • 回答于 2015-11-20 11:39 举报
    
    function isIdCardNo(num)
    
    {  
    
              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;
    
             }
    
    //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
    
    //下面分别分析出生日期和校验位
    
    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;
    
    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位
    
    //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
    
              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 num;  
    
    }  
    
    }
    
    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;
    
    bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
    
    if (!bGoodDay)
    
    {
    
    alert(dtmBirth.getYear());
    
    alert(arrSplit[2]);
    
    alert('输入的身份证号里出生日期不对!');
    
    return false;
    
    }
    
    else
    
    {
    
    //检验18位身份证的校验码是否正确。
    
    //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
    
    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位身份证的校验码不正确!应该为:' + valnum);
    
    return false;
    
    }
    
    return num;
    
    }
    
    }
    
    return false;
    
    }   
    
    2 条回复
    回复于 2015-11-21 12:33 回复

    这个是js的验证吧

    回复于 2015-11-21 15:58 回复

            ['id_number', function ($attribute, $params){
                $cin = new CheckIdNum();
                if($cin->checkIdentity($this->id_number)){
                    return true;
                }else{
                    $this->addError($attribute, '请输入正确的身份证号!');
                }
            }],
    

    我把验证的封装成了 一个class

您需要登录后才可以回答。登录 | 立即注册
了然听雨
主管

了然听雨

注册时间:2015-06-08
最后登录:2016-04-21
在线时长:12小时34分
  • 粉丝5
  • 金钱435
  • 威望0
  • 积分555

热门问题