PHP 內建兩套正則引擎:
/pattern/()、{}、[]、<>| 修飾符 | 常數 | 說明 |
|---|---|---|
i | PCRE_CASELESS | 大小寫不敏感匹配 |
s | PCRE_DOTALL | 點號 . 匹配換行符(預設不匹配) |
m | PCRE_MULTILINE | ^/$ 匹配每行首尾而非整個字串首尾 |
x | PCRE_EXTENDED | 忽略模式中的空白與 # 註釋,提升可讀性 |
e | PREG_REPLACE_EVAL | 已棄用/移除:preg_replace() 將替換字串視為 PHP 代碼執行(極度危險) |
A | PCRE_ANCHORED | 強制錨定模式,僅從字串開頭嘗試匹配 |
D | PCRE_DOLLAR_ENDONLY | $ 僅匹配字串絕對結尾(忽略末尾換行),與 m 衝突時被忽略 |
S | — | 啟用額外模式分析,適合重複使用的非錨定模式提升速度 |
U | PCRE_UNGREEDY | 反轉貪婪模式:量詞預設非貪婪,? 變為貪婪標記 |
X | PCRE_EXTRA | 嚴格模式:反斜線後接無特殊含義字元將報錯(保留向後相容) |
J | PCRE_INFO_JCHANGED | 允許子模式重名(需配合 (?J) 內部選項) |
u | PCRE_UTF8 | 將模式視為 UTF-8 編碼(PHP 4.1.0+ Unix / 4.2.3+ Win32) |
$text = "第一行\n第二行\n第三行";
// 無 m 修飾符:^ 僅匹配開頭
preg_match('/^第二行/', $text); // false
preg_match('/^第二行/m', $text); // true
$pattern = '/
\d{4} # 年份
- # 分隔符
\d{2} # 月份
- # 分隔符
\d{2} # 日期
/x';
preg_match($pattern, '2024-12-25'); // true
$html = '<div>內容1</div><div>內容2</div>';
preg_match_all('/<div>.+?<\/div>/', $html, $m); // 正確分別捕獲兩個 div
preg_match_all('/<div>.+<\/div>/U', $html, $m); // U 修飾符同樣效果
e 修飾符:極大安全風險,改用 preg_replace_callback()u:否則多位元組字元會被視為多個單位字元導致錯誤A、重複使用模式加 S/ 時改用 # 或 ~ 避免跳脫地獄PHP 綁定的 PCRE 版本可透過 phpinfo() 或 PCRE_VERSION 常數查看。不同版本支援特性不同(如 (?>...) 原子群組、(?|...) 分支重置等),跨環境部署時請測試關鍵正則。