PHP身份证格式,合法性,是否未成年验证

public function test(){
        $IDCard = $_GET['id'];

        $result['error'] = 0;//0:未知错误,1:身份证格式错误,2:无错误
        $result['isAdult'] = '';//0标示成年,1标示未成年
        $result['birthday'] = '';//生日,格式如:2012-11-15
        $city = array(
            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_dump(!preg_match("/^[1-9]([0-9a-zA-Z]{17}|[0-9a-zA-Z]{14})$/i", $IDCard));die;
        // var_dump((bool)preg_match("/^[1-9]\d{5}(19|20|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/", $IDCard) === false);die;
        if((bool)preg_match("/^[1-9]\d{5}(19|20|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/", $IDCard) === false){
            $result['error'] = 1;
        }else if( isset($city[intval(substr($IDCard, 0, 2))]) === false ){  
            $result['error'] = 0;
        }else{
            if(strlen($IDCard) == 18){
                //合法性验证
                $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 );
                $parity = array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 );

                $sum = 0;  
                $ai = 0;  
                $wi = 0;  

                $code = array();

                for ($i=0; $i < 17; $i++) { 
                    $ai = $code[$i] = substr($IDCard, $i, 1);
                    $wi = $factor[$i];  
                    $sum += $ai * $wi;
                }

                if($parity[$sum % 11] != strtoupper(substr($IDCard, 17, 1)) ){  
                    $result['error'] = 0;
                }else{
                    //年份
                    $tyear = intval(substr( $IDCard,6,4));
                    //月份
                    $tmonth = intval(substr( $IDCard,10,2));
                    //日
                    $tday = intval(substr( $IDCard,12,2));
                    //判断年月日是否未成年
                    if( $tyear > date("Y") || $tyear < (date("Y") - 100)){
                        $flag = 0;
                    }elseif($tmonth < 0 || $tmonth > 12){
                        $flag = 0;
                    }elseif($tday < 0 || $tday > 31){
                        $flag = 0;
                    }else{
                        $tdate = $tyear."-".$tmonth."-".$tday." 00:00:00";
                        if((time() - mktime(0, 0, 0, $tmonth, $tday, $tyear)) > 18 * 365 * 24 * 60 * 60){
                            $flag = 0;
                            $result['error'] = 2;
                        }else{
                            $flag = 1;
                            $result['error'] = 2;
                        }
                    }
                }
            }elseif( strlen($IDCard) == 15){
                $tyear = intval("19".substr( $IDCard, 6, 2));
                $tmonth = intval(substr( $IDCard, 8, 2));
                $tday = intval(substr( $IDCard, 10, 2));
                if( $tyear > date("Y") || $tyear < ( date("Y") - 100) ){
                    $flag = 0;
                }elseif( $tmonth < 0 || $tmonth > 12){
                    $flag = 0;
                }elseif( $tday < 0 || $tday > 31){
                    $flag = 0;
                }else{
                    $tdate = $tyear."-".$tmonth."-".$tday." 00:00:00";
                    if((time() - mktime( 0, 0, 0, $tmonth, $tday, $tyear)) > 18 * 365 * 24 * 60 * 60){
                        $flag = 0;
                        $result['error'] = 2;
                    }else{
                        $flag = 1;
                        $result['error'] = 2;
                    }
                }
            }

        }
        
        if ($result['error'] == 2) {
            $result['isAdult'] = $flag;//0标示成年,1标示未成年
            $result['birthday'] = $tdate;//生日日期
        }else if ($result['error'] == 1) {
            $result['error'] = '身份证格式错误';//0:未知错误,1:身份证格式错误,2:无错误
            unset( $result['isAdult']);
            unset( $result['birthday']);
        }else if ($result['error'] == 0) {
            $result['error'] = '请填写正确的身份证';//0:未知错误,1:身份证格式错误,2:无错误
            unset( $result['isAdult']);
            unset( $result['birthday']);
        }
        var_dump($result);die;
        // return $result;  
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值