正則表達式是 PHP 中處理字串匹配、驗證、擷取、替換的利器。本文系統整理語法規則、核心函數與實戰範例,助你從入門到精通。
模式必須包裹在定界符中,慣用 /,也可用 #、~ 等非字母數字字元:
/pattern/ # 正確 #pattern# # 正確,適合包含 / 的模式 (如 URL)
| 元字符 | 含義 | 範例匹配 |
|---|---|---|
+ | 前導字元出現 1 次或多次 | /php+/ 匹配 "phpp"、"phppp" |
* | 前導字元出現 0 次或多次 | /php*/ 匹配 "ph"、"php"、"phpp" |
? | 前導字元出現 0 次或 1 次 | /php?/ 匹配 "ph"、"php" |
{n} | 恰好 n 次 | /php{2}/ 匹配 "phpp" |
{n,} | 至少 n 次 | /php{2,}/ 匹配 "phpp"、"phppp"... |
{n,m} | n 到 m 次 | /php{1,3}/ 匹配 "php"~"phppp" |
| 符號 | 匹配範圍 |
|---|---|
\s | 空白字元 (空格、Tab、換行) |
\S | 非空白字元 |
\d | 數字 0-9 |
\D | 非數字 |
\w | 字母、數字、底線 (等同 [a-zA-Z0-9_]) |
\W | 非單字字元 |
. | 除換行外任意字元 |
| 符號 | 含義 |
|---|---|
^ | 字串開頭 (多行模式下為行首) |
$ | 字串結尾 (多行模式下為行尾) |
\b | 單字邊界 (開頭或結尾) |
\B | 非單字邊界 |
/[A-Z]/ # 任一大寫字母 /[a-z]/ # 任一小寫字母 /[0-9]/ # 任一數字 /([a-zA-Z0-9])+/ # 字母數字組成的字串 (至少一字元)
/phpddt\.com|phpddt|100/ # 匹配三者任一
/[^phpddt]/ # 匹配任一非 p/h/p/d/d/t 字元
/(\w+)\s+\1/ # 匹配重複單字 (如 "hello hello") /(?\w+)/ # 命名捕獲組 (PHP 5.2.2+)
| 修飾符 | 效果 |
|---|---|
i | 忽略大小寫 |
m | 多行模式 (^/$ 匹配行首尾) |
s | 單行模式 (. 匹配含換行) |
x | 擴展模式 (忽略模式空白、允許註解) |
u | UTF-8 模式 (正確處理中文) |
U | 非貪婪模式 (量詞預設最小匹配) |
/pattern/iu # 組合使用:忽略大小寫 + UTF-8
$email = "user@example.com";
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
if (preg_match($pattern, $email)) {
echo "Email 格式正確";
}
回傳 1 (匹配)、0 (不匹配)、false (錯誤)。
$text = "Email: a@b.com, c@d.org";
preg_match_all('/[\w.+-]+@[\w.-]+\.\w+/', $text, $matches);
print_r($matches[0]); // 所有完整匹配
// Array ( [0] => a@b.com [1] => c@d.org )
$text = "訪問 https://example.com 了解更多";
// 將 URL 自動轉為超連結
echo preg_replace(
'/https?:\/\/[^\s]+/',
'$0',
$text
);
// 輸出: 訪問 https://example.com 了解更多
echo preg_replace_callback(
'/\b(\w+)\b/',
function($m) { return strtoupper($m[1]); },
'hello world'
); // HELLO WORLD
$str = "apple,banana;orange|grape";
$fruits = preg_split('/[,;|]+/', $str);
// Array ( [0] => apple [1] => banana [2] => orange [3] => grape )
$arr = ["phpddt", "php100", "hello", "phpchina"];
$result = preg_grep('/^php/', $arr);
// Array ( [0] => phpddt [1] => php100 [3] => phpchina )
$str = "price: $100 (50%)"; echo preg_quote($str); // price: \$100 \(50\%\)
function is_mobile($phone) {
return preg_match('/^1[3-9]\d{9}$/', $phone);
}
function is_idcard($id) {
return preg_match('/^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/', $id);
}
$html = ''; preg_match_all('/(\w+)="([^"]*)"/', $html, $m, PREG_SET_ORDER); foreach ($m as $attr) { echo "$attr[1] = $attr[2]\n"; } // src = logo.png // alt = Logo // class = img-responsive
$clean = preg_replace('/<[^>]+>/', '', $html);
// 或更嚴謹:strip_tags() 內建函數
echo preg_replace('/(\d)(?=(\d{3})+(?!\d))/', '$1,', '1234567.89');
// 1,234,567.89
static $pattern = null; if ($pattern === null) $pattern = '/complex_pattern/';
^、$、\b 大幅減少回溯(a+)+、(.*)* 易導致災難性回溯.*?、.+? 替代 .*、.+strpos、substr、explode 效能高數倍pcre.jit=1 (預設開啟)掌握正則表達式,能以極簡代碼解決複雜字串處理問題。但記住:正則威力大,維護成本也高,關鍵業務邏輯務必加上詳細註解與單元測試。