分享一個身份證驗證接口

此接口可確認身份證號碼是真實的,但無法確定身份證號碼與姓名對應

/**
     * 身份證驗證
     * @param $card
     * @return bool
     */
    public static function checkCard($card){
        $city = [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=>"國外 "];
        $tip = "";
        $match = "/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/";
        $pass= true;
        if(!$card || !preg_match($match,$card)){
            //身份證格式錯誤
            $pass = false;
        }else if(!$city[substr($card,0,2)]){
            //地址錯誤
            $pass = false;
        }else{
            //18位身份證需要驗證最後一位校驗位
            if(strlen($card) == 18){
                $card = str_split($card);
                //∑(ai×Wi)(mod 11)
                //加權因子
                $factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
                //校驗位
                $parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
                $sum = 0;
                $ai = 0;
                $wi = 0;
                for ($i = 0; $i < 17; $i++)
                {
                    $ai = $card[$i];
                    $wi = $factor[$i];
                    $sum += $ai * $wi;
                }
                $last = $parity[$sum % 11];
                if($parity[$sum % 11] != $card[17]){
//                        $tip = "校驗位錯誤";
                    $pass =false;
                }
            }else{
                $pass =false;
            }
        }
        if(!$pass) return false;/* 身份證格式錯誤*/
        return true;/* 身份證格式正確*/
    }
發佈了11 篇原創文章 · 獲贊 3 · 訪問量 5076
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章