国产视频app前幾天寫了一篇關于PHP中如何檢測一些數據的正則表達式,其中就提到過如何檢測身份證號的正則表達式,但那種方式過于簡單。這篇文章就說說如何通過一個自定義的函數類,來檢測身份證號是否合法。

国产视频app檢測一個身份證的正確性,我個人分為兩種方法,一種是通過API接口,一種是本地自定義一個函數類,來檢測身份證號。

php用于檢測身份證號碼的函數,PHP檢測身份證號碼,PHP身份證號,PHP檢測身份證信息

檢測身份證信息API接口

国产视频app現在網上很多用于身份證信息檢測的API有很多,但都是收費的。這里我不推薦,大家如果需要自己百度即可。不過我可以和大家說一說他們的檢測原理,方便各大位接入。

API身份證信息檢測原理:

国产视频app1、發送身份證上的姓名,與身份證號碼到指定的服務器

2、指定的服務器,通過接收的數據,與公安部身份證數據中的信息進行對比

国产视频app3、對比成后,會返回對比結果。當然結果中還會包含其它信息,比如性別,居住地等

国产视频appAPI身份證信息檢測注意事項

為保護網站客戶的信息不外漏,我們選擇身份證信息檢測API提供商時要注意選擇正規的商家,比如阿里云等一些比如知名的企業。

国产视频app本地留存的身份證信息要進行加密處理。以防信息被竊取。

PHP身份證號本地檢測自定義函數

如果我們不采信API接口的形式來檢測身份證信息的準確性,可以通過身份證號的生成規則,本地編寫一個用于檢測身份證號碼的函數。但這種方法,僅僅用于身份證號是否正確的檢測。

自定義函數類代碼:

class IDCard {   
    //檢證身份證是否正確   
    public static function isCard($card) {   
        $card = self::to18Card($card);   
        if (strlen($card) != 18) {   
            return false;   
        }   
        $cardBase = substr($card, 0, 17);   
        return (self::getVerifyNum($cardBase) == strtoupper(substr($card, 17, 1)));   
    }   
    //格式化15位身份證號碼為18位   
    public static function to18Card($card) {   
        $card = trim($card);   
        if (strlen($card) == 18) {   
            return $card;   
        }   
        if (strlen($card) != 15) {   
            return false;   
        }   
        // 如果身份證順序碼是996 997 998 999,這些是為百歲以上老人的特殊編碼   
        if (array_search(substr($card, 12, 3), array('996', '997', '998', '999')) !== false) {   
            $card = substr($card, 0, 6) . '18' . substr($card, 6, 9);   
        } else {   
            $card = substr($card, 0, 6) . '19' . substr($card, 6, 9);   
        }   
        $card = $card . self::getVerifyNum($card);   
        return $card;   
    }   
    // 計算身份證校驗碼,根據國家標準gb 11643-1999   
    private static function getVerifyNum($cardBase) {   
        if (strlen($cardBase) != 17) {   
            return false;   
        }   
        // 加權因子   
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);   
        // 校驗碼對應值   
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');   
        $checksum = 0;   
        for ($i = 0; $i < strlen($cardBase); $i++) {   
            $checksum += substr($cardBase, $i, 1) * $factor[$i];   
        }   
        $mod = $checksum % 11;   
        $verify_number = $verify_number_list[$mod];   
        return $verify_number;   
    }   
}

調用方式

$nber = '身份證號碼';
$IDCard = new IDCard();   
var_dump($IDCard::isCard($nber));