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開始的字串