[PHP] 身分證驗證 Preg_match 正則表達式

php 身分證驗證 身份證 檢查 驗證 

preg_match 正則表達式

ereg

字元比對

起始符號

 

  • 最近需要用到身分證驗證,參考各位大大的版本,進一步去改寫
    • 主要是正則式驗證function,ereg 已經是 deprecated 了,所以我這邊是使用preg_match
  • function checkId($id) {
            // 去空白&轉大寫
            $id = strtoupper(trim($id));
    
            // 英文字母與數值對照表
            $alphabetTable = [
                'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15, 'G' => 16,
                'H' => 17, 'I' => 34, 'J' => 18, 'K' => 19, 'L' => 20, 'M' => 21, 'N' => 22,
                'O' => 35, 'P' => 23, 'Q' => 24, 'R' => 25, 'S' => 26, 'T' => 27, 'U' => 28,
                'V' => 29, 'X' => 30, 'Y' => 31, 'Z' => 33
            ];
    
            // 檢查身份證字號格式
            // ps. 第二碼的例外條件ABCD,在這裡未實作,僅提供需要的人參考,實作方式是A對應10,只取個位數0去加權即可
            // 臺灣地區無戶籍國民、大陸地區人民、港澳居民:
            // 男性使用A、女性使用B
            // 外國人:
            // 男性使用C、女性使用D
            if (!preg_match("/^[A-Z]{1}[12ABCD]{1}[0-9]{8}$/", $id)){
                // ^ 是開始符號
                // $ 是結束符號
                // [] 中括號內是正則條件
                // {} 是要重複執行幾次
                throw new Exception('格式、長度錯誤'); 
            }
    
            // 切開字串
            $idArray = str_split($id);
    
            // 英文字母加權數值
            $alphabet = $alphabetTable[$idArray[0]];
            $point = substr($alphabet, 0, 1) * 1 + substr($alphabet, 1, 1) * 9;
    
            // 數字部分加權數值
            for ($i = 1; $i <= 8; $i++) {
                $point += $idArray[$i] * (9 - $i);
            }
            $point = $point + $idArray[9];
    
            return $point % 10 == 0 ? true : false;
        }

     

  • END
  • 補充正則表達式常用的特殊符號:
    •  
    • 特殊符號 說明 範例 說明
      | 表示選擇其中一個進行比對 re1|re2 選擇比對正則表達式re1或是re2
      . 比對除了\n之外的任意字元 d.d 表示比對d與d之間為任意字元的情況,例如"did"或是"d2d"等
      ^ 比對字元的起始部分 ^my 表示比對任何以my作為開始的字串
      $ 比對字元串終止符號 bye$ 表示比對任何以bye結束的字串
      * 比對0或是多次左邊出現的正則表達式 [0-9]* 表示比對以任意數字作為開始的字串
      + 比對一次或是多次左邊出現的正則表達式 [0-9]+ 表示比對以一個或是多個數字開始的字串
      ? 比對0次或是1次左邊出現的正則表達式 [0-9]? 表示比對以0個或是1個數字開始的字串
      {N} 比對N次左邊出現的正則表達式 [0-9]{N} 表示比對以N個數字開始的字串
      {M, N} 比對M次到N次左邊出現的正則表達式 [0-9]{M, N} 表示比對以M個到N個數字開始的字串
      [...] 比對來自中括號內任意的字元 [abcd] 表示比對a或者b或者c或者d
      [.-.] 比對從...到...之間的任意字元 [a-g] 表示比對a到g之間的任意一個字元,如a或b...
      [^...] 不比對此字元集合中的任意一個字元 [^abc] 表示比對不是字元a或b或c的任意字元
      () 對正則表達式進行分組或者比對子組 ([0-9]{3})? 表示比對三個數字出現一次或者不出現的情況
      \d(\D) \d 比對任何一個十進位制的數字,\D不比對任何數字 \d\d\d 比對三個數字的字串
      \w(\W) \w 比對任何一個英文字母字元,\W不比對任何英文字母字元 \w+ 比對一個由英文字母字元組成的字元串
      \s(\S) \s 比對任何空格字元,\S不比對任何空格字元 of\sthe 比對of和the之間有任何空格字元的情況
      \b(\B) \b 比對任何單詞邊界,\B不比對任何單詞邊界 \bthe 任何以the開始的字元串
      \N 比對已保存的子組N price:N 比對price:後面加以保存的子組N的形式
      \c 僅按照的字面意思進行比對 /* 比對字元符號*
      \A(\Z) \A 比對字串的開始,\Z比對字串的結束 \Acar 比對以car開始的字串