在 PHP 的正則表達式中,模式修飾符用於改變正則引擎的匹配行為。它們通常放在正則表達式的結束分隔符之後,例如 /pattern/i 中的 i。某些修飾符也可以通過 (?modifier) 語法直接寫在表達式內部,實現局部生效。
| 修飾符 | 內部寫法 | 說明 |
|---|---|---|
| i | (?i) | 忽略大小寫匹配 |
| m | (?m) | 增強行錨點模式(^ 和 $ 匹配每一行的開頭和結尾) |
| s | (?s) | 點號通配模式(. 可以匹配換行符) |
| x | (?x) | 寬鬆排列與註釋模式(忽略空白,允許 # 註釋) |
| u | — | 以 UTF-8 模式解析正則與目標字串 |
| X | (?X) | 啟用 PCRE 額外功能(更嚴格的錯誤檢查) |
| e | — | 將 replacement 視為 PHP 代碼執行(僅用於 preg_replace,已棄用) |
| S | — | 啟用 PCRE study 優化(適合重複使用的複雜模式) |
| 修飾符 | 內部寫法 | 說明 |
|---|---|---|
| U | (?U) | 反轉貪婪與非貪婪量詞的預設行為(* 變非貪婪,*? 變貪婪) |
| A | — | 強制匹配必須從字串開頭開始(相當於 ^) |
| D | — | $ 僅匹配字串絕對結尾(EOS),不匹配結尾前的換行符(若使用 m 則無效) |
在正則內部,修飾符可以單獨出現以啟用或停用特性:
(?i) — 開啟不區分大小寫(?-i) — 關閉不區分大小寫也可以限定作用範圍:
(?i:...) — 僅對括號內內容不區分大小寫(?-sm:...) — 在此範圍內關閉 s 和 m 模式結束分隔符後的修飾符可任意順序組合。例如:
if (preg_match('{<title>(.*?)</title>}si', $html, $captures))
上例中 si 同時啟用了「忽略大小寫」與「點號匹配換行」。