首頁 >後端開發 >php教程 >如何用PHP正規表示式驗證輸入字串是否為正確的身分證號碼、護照號碼或軍官證號碼格式

如何用PHP正規表示式驗證輸入字串是否為正確的身分證號碼、護照號碼或軍官證號碼格式

WBOY
WBOY原創
2023-06-24 09:30:061114瀏覽

在網站或應用程式中,我們經常需要對使用者輸入的資訊進行驗證,其中身分證號碼、護照號碼和軍官證號碼都是常見的驗證對象。在PHP中,正規表示式是一種非常方便的工具,可用來驗證輸入字串的格式是否正確。本文將介紹如何使用PHP正規表示式驗證身分證號碼、護照號碼和軍官證號碼格式。

  1. 驗證身分證號碼格式

身分證號碼為18位或15位數字,18位身分證號碼的最後一位可能為數字或字母X。以下是驗證身分證號碼格式的PHP程式碼:

function checkIDCard($idcard){
    if(strlen($idcard)==18){
        return checkIDCard18($idcard);
    }elseif(strlen($idcard)==15){
        $idcard = idcardPro18to15($idcard);
        return checkIDCard15($idcard);
    }else{
        return false;
    }
}

// 验证18位身份证号码
function checkIDCard18($idcard){
    $regx = "/^d{17}(d|x)$/i";
    if(preg_match($regx, $idcard)){
        $idcard = strtoupper($idcard);
        $idcard_year = intval(substr($idcard,6,4));
        $idcard_month = intval(substr($idcard,10,2));
        $idcard_day = intval(substr($idcard,12,2));
        if(checkdate($idcard_month, $idcard_day, $idcard_year)){
            $idcard_base = substr($idcard, 0, 17);
            if(getVerifyBit($idcard_base) == substr($idcard, 17, 1)){
                return true;
            }
        }
    }
    return false;
}

// 验证15位身份证号码
function checkIDCard15($idcard){
    $regx = "/^d{15}$/i";
    if(preg_match($regx, $idcard)){
        $idcard = idcardPro15to18($idcard);
        return checkIDCard18($idcard);
    }else{
        return false;
    }
}

// 获取身份证校验码
function getVerifyBit($idcard_base){
    if(strlen($idcard_base)!= 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($idcard_base);$i++){
        $checksum += substr($idcard_base, $i, 1) * $factor[$i];
    }
    $mod = $checksum % 11;
    $verify_number = $verify_number_list[$mod];
    return $verify_number;
}

// 将15位身份证号码转成18位
function idcardPro15to18($idcard){
    if(strlen($idcard)!=15){
        return false;
    }else{
        $year = '19' . substr($idcard, 6, 2);
        $month = substr($idcard, 8, 2);
        $day = substr($idcard, 10, 2);
        $idcard = substr_replace($idcard, $year, 6, 2);
        $idcard = substr_replace($idcard, $month, 8, 2);
        $idcard = substr_replace($idcard, $day, 10, 2);
        return $idcard;
    }
}

// 将18位身份证号码转成15位
function idcardPro18to15($idcard){
    if(strlen($idcard)!=18){
        return false;
    }else{
        $idcard = substr($idcard,0,6) . substr($idcard,8,9);
        return $idcard;
    }
}

程式碼首先根據身分證號碼的長度呼叫不同的驗證函數。驗證18位元身分證號碼的函數checkIDCard18($idcard) 使用了正規表示式/^d{17}(d|x)$/i,該正規表示式匹配18位數字頭和可選的數字或字母X。如果配對成功,函數繼續驗證身分證號碼的出生日期是否正確,以及取得身分證校驗碼,並與最後一位數字或字母 X 進行比較。驗證15位元身分證號碼的函數 checkIDCard15($idcard) 首先將其轉換為18位元身分證號碼再呼叫 checkIDCard18($idcard) 函數進行驗證。

  1. 驗證護照號碼格式

護照號碼格式是固定的,為1位大寫字母 6-9位數字。以下是驗證護照號碼格式的PHP代碼:

function checkPassport($passport){
    $regx = "/^[a-zA-Z]d{6,9}$/i";
    if(preg_match($regx, $passport)){
        return true;
    }else{
        return false;
    }
}

程式碼使用正規表示式/^[a-zA-Z]d{6,9}$/i,該正規則表達式匹配以一個大寫字母開頭,後面6至9位為數字的字串。

  1. 驗證軍官證號碼格式

軍官證號為10至18位數字和字母的組合,其中第10位至第16位為數字,第17位可以為數字或字母。以下是驗證軍官證號碼格式的PHP程式碼:

function checkOfficerCard($officercard){
    $regx = "/^w{9,17}$/i";
    if(preg_match($regx, $officercard)){
        if(ctype_digit(substr($officercard, 9, 7))){
            return true;
        }elseif(ctype_digit(substr($officercard, 9, 6)) && ctype_alpha(substr($officercard, 16, 1))){
            return true;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

程式碼使用正規表示式/^w{9,17}$/i,該正規表示式符合9至17位數字和字母的組合字串。如果配對成功,函數繼續驗證軍官證號碼的第10至16位是否為數字,以及第17位是否為數字或字母。

總結

本文介紹如何使用PHP正規表示式驗證身分證號碼、護照號碼和軍官證號碼格式。使用正規表示式可有效驗證使用者輸入資訊的格式是否符合要求。特別是身分證號碼的驗證,需要根據不同位數呼叫不同的驗證函數,包括驗證出生日期和產生校驗碼等。但是,在驗證資訊的同時,應對用戶的隱私要進行保護。

以上是如何用PHP正規表示式驗證輸入字串是否為正確的身分證號碼、護照號碼或軍官證號碼格式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn