正則表達式在 PHP 中的地位
PHP 提供兩套正則函式:PCRE (preg_*) 與 POSIX (ereg_*)。POSIX 自 PHP 5.3 棄用、PHP 7 移除,現代開發一律使用 PCRE(Perl 相容正則表達式),語法強大且效能優異。
PCRE 模式定界符與基本語法
模式須包裹於定界符,慣用 `/pattern/` 或 `#pattern#`、`~pattern~`。元字符、量詞、字元類別、分組、斷言等語法與 Perl 一致。
常用元字元速查表
| 元字元 | 說明 |
\A | 字串開頭(不受多行模式影響) |
\Z | 字串結尾(不受多行模式影響) |
\b | 單詞邊界 |
\B | 非單詞邊界 |
\d | 數字 `[0-9]` |
\D | 非數字 `[^0-9]` |
\w | 字母數字底線 `[0-9a-zA-Z_]` |
\W | 非字母數字底線 |
\s | 空白字元 `[ \t\n\r\f\v]` |
\S | 非空白字元 |
. | 任意字元(預設不含換行,`s` 修飾符含換行) |
^ | 行首(`m` 修飾符啟用多行模式) |
$ | 行尾(`m` 修飾符啟用多行模式) |
模式修飾符
| 修飾符 | 名稱 | 效果 |
i | PCRE_CASELESS | 大小寫不敏感 |
m | PCRE_MULTILINE | `^$` 匹配行首行尾 |
s | PCRE_DOTALL | `.` 匹配含換行 |
x | PCRE_EXTENDED | 忽略模式中的空白與註釋 |
U | PCRE_UNGREEDY | 量詞預設非貪婪 |
u | PCRE_UTF8 | UTF-8 模式(處理中文必加) |
e | PREG_REPLACE_EVAL | 已移除 (PHP 7),勿使用 |
核心函式速查
| 函式 | 用途 | 回傳值 |
preg_match | 匹配一次 | `1`/`0`/`false`,第三參數捕獲結果 |
preg_match_all | 全域匹配 | 匹配次數,第三參數捕獲所有結果 |
preg_replace | 搜尋替換 | 新字串,或陣列 |
preg_replace_callback | 回調替換 | 新字串 |
preg_split | 正則分割 | 陣列 |
preg_grep | 陣列過濾 | 匹配的陣列元素 |
preg_quote | 跳脫特殊字元 | 安全字串 |
進階技巧:斷言與回調
1. 預瞻/回顧斷言(零寬度斷言)
// 匹配 action="..." 但排除 http: 開頭
preg_match_all('/(?<=action=")(?!http:)(.*?)(?="\s)/', $html, $m);
// 匹配無屬性 HTML 標籤內容 text
preg_match_all('/(?<=<(\w+)>).*?(?=<\/\1>)/', $str, $m);
2. 替換回調:動態計算替換值
$url = 'https://example.com';
$html = preg_replace_callback(
'/(?<=action="|src="|href=")(?!http:|javascript)(.*?)(?="\s)/',
function($m) use ($url) { return $url . '/' . $m[1]; },
$html
);
3. 非捕獲群組 `(?:...)`
// 僅需引用第 2 組
/(?:a|b|c)(D|E|F)\2g/ // 匹配 aEEg, bFFg 等
實用常用正則範例庫
// Email (簡易)
/^[\w.+-]+@[\w-]+\.[\w.-]+$/
// URL
/^https?:\/\/[\w.-]+\.[a-z]{2,}(\/\S*)?$/i
// 手機號 (台灣)
/^09\d{8}$/
// 統一編號 (台灣)
/^\d{8}$/
// 日期 YYYY-MM-DD
/^\d{4}-\d{2}-\d{2}$/
// IPv4
/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/
// HTML 標籤 (簡易)
/<[^>]+>/
// 去除 HTML 標籤
$text = preg_replace('/<[^>]+>/', '', $html);
效能與最佳實踐
- 能用字串函式解決就不用正則:`strpos`、`substr`、`explode` 效能遠高於正則。
- 編譯緩存:同一模式重複使用時,PHP 內部會緩存編譯結果,但動態生成模式會重複編譯。
- 避免災難性回溯:嵌套量詞 `(a+)+`、模糊匹配 `.*` 遇長字串極慢,改用具體字元類別或佔有優先量詞 `*+` `++`。
- 中文處理必加 `u` 修飾符:否則 `.`、`\w` 等按位元組匹配,導致亂碼或錯誤。
- 工具推薦:regex101.com 即時測試、解釋、生成代碼。