PCRE 正則修飾符 (Pattern Modifiers) 控制匹配行為。本文系統整理所有修飾符含義、組合用法與實戰陷阱。
| 修飾符 | 常數 | 功能 | 示例 |
|---|---|---|---|
i | PCRE_CASELESS | 大小寫不敏感 | /php/i 匹配 PHP/php/Php |
m | PCRE_MULTILINE | 多行模式:^/$ 匹配每行首尾 | /^start/m 匹配每行開頭 |
s | PCRE_DOTALL | . 匹配換行符 (預設不匹配) | /a.b/s 匹配 "a\nb" |
x | PCRE_EXTENDED | 忽略模式空白、允許註釋 # | 可寫多行可讀正則 |
u | PCRE_UTF8 | 按 UTF-8 處理 (支援中文) | /漢字/u 正確匹配 |
U | PCRE_UNGREEDY | 反轉貪婪/非貪婪預設行為 | /a.+?b/U 變貪婪 |
A | PCRE_ANCHORED | 強制從字符串開頭匹配 (如 ^) | /pattern/A |
D | PCRE_DOLLAR_ENDONLY | $ 僅匹配字符串絕對末尾 (忽略末尾換行) | 需配合 m 使用 |
S | PCRE_STUDY | 預編譯優化 (重複使用時) | 長正則提速 |
X | PCRE_EXTRA | 嚴格模式:反斜杠後接無意義字符報錯 | 預留未來擴展 |
J | PCRE_DUPNAMES | 允許重複命名子組 (?<name>...) | /(?<x>a)|(?<x>b)/J |
/pattern/iu // 經典:不區分大小寫 + UTF-8
/pattern/is // 單行模式:.匹配換行 + 不區分大小寫
/pattern/isu // 通用:多行文本、中文、大小寫
/pattern/xu // 可讀模式:可寫註釋、縮進、UTF-8
$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/^Line \d$/m', $text, $m); // 匹配每行
preg_match('/Line 1.Line 3/s', $text); // . 跨行匹配
$str = "你好世界";
// 無 u: 按字節匹配,可能誤傷
preg_match('/^.{2}/', $str); // 匹配 "你" (2字節) + "好" 第1字節 = 亂碼
preg_match('/^.{2}/u', $str); // 正確匹配 "你好" (2字符)
// 字符邊界
preg_match('/\b漢字\b/u', $str); // \b 在 u 模式下正確識別中文邊界
$html = '<div>A</div><div>B</div>';
// 預設貪婪
preg_match('/<div>.+<\/div>/', $html); // 匹配整串 "A</div><div>B"
// 非貪婪 ?
preg_match('/<div>.+?<\/div>/', $html); // 匹配 "<div>A</div>"
// U 修飾符反轉預設
preg_match('/<div>.+<\/div>/U', $html); // 等同非貪婪,匹配 "<div>A</div>"
preg_match('/<div>.+?<\/div>/U', $html); // 反而變貪婪,匹配整串
在模式內部動態切換:
/(?i)case(?-i)sensitive/ // "case" 不區分大小寫,"sensitive" 區分
/(?s).*$/ // 僅此段啟用 s
/(?U).+/ // 僅此段反轉貪婪
S 修飾符預編譯{1,100}preg_match_all 分段處理re2 (Google RE2) 或編寫 C 擴展掌握修飾符組合 (isu 為通用基礎)、內嵌修飾符靈活控制、x 寫可維護正則,是 PHP 正則高手必備技能。調試時善用 preg_last_error()、preg_last_error_msg() (PHP 8+) 定位問題。