真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP驗(yàn)證身份證格式是什么

這篇文章將為大家詳細(xì)講解有關(guān)PHP驗(yàn)證身份證格式是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的離石網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

互聯(lián)網(wǎng)公司對(duì)身份證驗(yàn)證的需求越來(lái)越多,然而普通的小公司是無(wú)法對(duì)接公安部門(mén)的身份認(rèn)證系統(tǒng)的。幾乎都是在網(wǎng)上買(mǎi)一些大的互聯(lián)網(wǎng)公司的一些認(rèn)證服務(wù)。即使是便宜一些的認(rèn)證價(jià)格也達(dá)到了10萬(wàn)次/萬(wàn)元。也就是一角錢(qián)一次了,還是挺貴哈。所以為了減少公司的開(kāi)支,我們?cè)谀玫接脩?hù)提交的身份證信息去認(rèn)證前應(yīng)該自己先檢驗(yàn)一下身份證的格式,如果連最基本的身份證格式就不滿(mǎn)足的話(huà),我們完全可以直接駁回,不必走接下來(lái)的花錢(qián)認(rèn)證流程了,而且也可以建立一個(gè)用戶(hù)身份證表,把每次認(rèn)證通過(guò)的數(shù)據(jù)存起來(lái),以后每次都先從自己系統(tǒng)里的用戶(hù)身份證表查詢(xún),查不到再去走認(rèn)證流程,最大化節(jié)省公司開(kāi)支。
這里提供一個(gè)初步驗(yàn)證身份證格式的PHP身份證驗(yàn)證類(lèi)。該類(lèi)只提供一個(gè)靜態(tài)方法isValid接口,使用起來(lái)也很簡(jiǎn)單,只需要使用IdentityCard::isValid即可驗(yàn)證??梢苑诺阶约喉?xiàng)目中當(dāng)做工具類(lèi)。該方法可以同時(shí)驗(yàn)證15位的老身份證和18位的新身份證格式
PHP版本: >=7.0.0
注:如果PHP版本低于7.0版本只需要把類(lèi)中方法的參數(shù)限制取消掉即可使用。

class IdentityCard
{
    /**
     * 校驗(yàn)身份證號(hào)是否合法
     * @param string $num 待校驗(yàn)的身份證號(hào)
     * @return bool
     */
    public static function isValid(string $num)
    {
        //老身份證長(zhǎng)度15位,新身份證長(zhǎng)度18位
        $length = strlen($num);
        if ($length == 15) { //如果是15位身份證

            //15位身份證沒(méi)有字母
            if (!is_numeric($num)) {
                return false;
            }
            // 省市縣(6位)
            $areaNum = substr($num, 0, 6);
            // 出生年月(6位)
            $dateNum = substr($num, 6, 6);

        } else if ($length == 18) { //如果是18位身份證

            //基本格式校驗(yàn)
            if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {
                return false;
            }
            // 省市縣(6位)
            $areaNum = substr($num, 0, 6);
            // 出生年月日(8位)
            $dateNum = substr($num, 6, 8);

        } else { //假身份證
            return false;
        }

        //驗(yàn)證地區(qū)
        if (!self::isAreaCodeValid($areaNum)) {
            return false;
        }

        //驗(yàn)證日期
        if (!self::isDateValid($dateNum)) {
            return false;
        }

        //驗(yàn)證最后一位
        if (!self::isVerifyCodeValid($num)) {
            return false;
        }

        return true;
    }

    /**
     * 省市自治區(qū)校驗(yàn)
     * @param string $area 省、直轄市代碼
     * @return bool
     */
    private static function isAreaCodeValid(string $area) {
        $provinceCode = substr($area, 0, 2);

        // 根據(jù)GB/T2260—999,省市代碼11到65
        if (11 <= $provinceCode && $provinceCode <= 65) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 驗(yàn)證出生日期合法性
     * @param string $date 日期
     * @return bool
     */
    private static function isDateValid(string $date) {
        if (strlen($date) == 6) { //15位身份證號(hào)沒(méi)有年份,這里拼上年份
            $date = '19'.$date;
        }
        $year  = intval(substr($date, 0, 4));
        $month = intval(substr($date, 4, 2));
        $day   = intval(substr($date, 6, 2));

        //日期基本格式校驗(yàn)
        if (!checkdate($month, $day, $year)) {
            return false;
        }

        //日期格式正確,但是邏輯存在問(wèn)題(如:年份大于當(dāng)前年)
        $currYear = date('Y');
        if ($year > $currYear) {
            return false;
        }
        return true;
    }

    /**
     * 驗(yàn)證18位身份證最后一位
     * @param string $num 待校驗(yàn)的身份證號(hào)
     * @return bool
     */
    private static function isVerifyCodeValid(string $num)
    {
        if (strlen($num) == 18) {
            $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            $tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

            $checkSum = 0;
            for ($i = 0; $i < 17; $i++) {
                $checkSum += intval($num{$i}) * $factor[$i];
            }

            $mod   = $checkSum % 11;
            $token = $tokens[$mod];

            $lastChar = strtoupper($num{17});

            if ($lastChar != $token) {
                return false;
            }
        }
        return true;
    }
}

使用示例:

// 測(cè)試
$num = '33071919610920021X';
if (IdentityCard::isValid($num)) {
    echo '身份證格式正確';
} else {
    echo '身份證格式不正確';
}

下面是身份證編碼各個(gè)部分的含義:

//=============新的18位身份證號(hào)碼各位的含義:=======================
//1-2位省、自治區(qū)、直轄市代碼;11-65
//3-4位地級(jí)市、盟、自治州代碼;
//5-6位縣、縣級(jí)市、區(qū)代碼;
//7-14位出生年月日,比如19670401代表1967年4月1日;
//15-17位為順序號(hào),其中17位男為單數(shù),女為雙數(shù);
//18位為校驗(yàn)碼,0-9和X,由公式隨機(jī)產(chǎn)生。
//舉例:
//130503 19670401 0012這個(gè)身份證號(hào)的含義: 13為河北,05為邢臺(tái),03為橋西區(qū),出生日期為1967年4月1日,順序號(hào)為001,2為驗(yàn)證碼
//===========15位身份證號(hào)碼各位的含義:=======================
//1-2位省、自治區(qū)、直轄市代碼;
//3-4位地級(jí)市、盟、自治州代碼;
//5-6位縣、縣級(jí)市、區(qū)代碼;
//7-12位出生年月日,比如670401代表1967年4月1日,這是和18位號(hào)碼的第一個(gè)區(qū)別;
//13-15位為順序號(hào),其中15位男為單數(shù),女為雙數(shù);
//與18位身份證號(hào)的第二個(gè)區(qū)別:沒(méi)有最后一位的驗(yàn)證碼。
//舉例:
//130503 670401 001的含義; 13為河北,05為邢臺(tái),03為橋西區(qū),出生日期為1967年4月1日,順序號(hào)為001。

關(guān)于PHP驗(yàn)證身份證格式是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


本文標(biāo)題:PHP驗(yàn)證身份證格式是什么
文章鏈接:http://weahome.cn/article/jhehdi.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部