在 preg_match()、preg_match_all() 等函數中,模式後的修飾符(如 /pattern/isU)決定了匹配行為。本文詳細解析 i、s、U 三個常用修飾符的作用與差異。
| 修飾符 | 名稱 | 作用 |
|---|---|---|
i (PCRE_CASELESS) | 不區分大小寫 | 匹配時忽略字母大小寫,/abc/i 可匹配 "ABC"、"Abc" 等。 |
s (PCRE_DOTALL) | 單行模式 / 點號匹配換行 | 使元字符 . 匹配任意字符(含換行符 \n)。預設下 . 不匹配換行。 |
U (PCRE_UNGREEDY) | 非貪婪模式 | 反轉量詞預設貪婪行為:*、+、?、{m,n} 變為非貪婪;需加 ?(如 *?)才恢復貪婪。 |
$html = "<div>內容1</div>\n<div>內容2</div>";
// 無 s 修飾符:. 不匹配換行,只匹配第一個 div
preg_match('/<div>(.*)<\/div>/i', $html, $m1);
// $m1[1] = "內容1"
// 加上 s:. 匹配換行,貪婪匹配到最後一個 </div>
preg_match('/<div>(.*)<\/div>/is', $html, $m2);
// $m2[1] = "內容1</div>\n<div>內容2"
// isU:非貪婪,匹配到最近的 </div>
preg_match('/<div>(.*)<\/div>/isU', $html, $m3);
// $m3[1] = "內容1"
i 僅影響 ASCII 字母。m(讓 ^$ 匹配行首尾),s 僅控制點號行為。?(如 *? 變 *),易混淆,建議顯式使用 *?、+? 等非貪婪量詞,而非依賴 U。isu 常用於解析跨行 HTML/JSON,但解析 HTML 推薦用 DOMDocument。\b 匹配單詞邊界(字母/數字/下劃線與非單詞字符交界)。中文無單詞邊界概念,對中文無效。
$a = "test,admin,abc";
$b = "te";
var_dump(preg_match("/\b{$b}\b/", $a)); // 0,因 "te" 在 "test" 內部,非邊界
掌握修飾符精髓,能寫出更精準、高效的正則表達式。