PHP Conference Japan 2024

內部選項設定

PCRE_CASELESSPCRE_MULTILINEPCRE_DOTALLPCRE_UNGREEDYPCRE_EXTRAPCRE_EXTENDED 和 PCRE_DUPNAMES 的設定,可以在模式中透過將 Perl 選項字母括在 "(?" 和 ")" 之間來更改。選項字母如下:

內部選項字母
i 代表 PCRE_CASELESS
m 代表 PCRE_MULTILINE
s 代表 PCRE_DOTALL
x 代表 PCRE_EXTENDED
U 代表 PCRE_UNGREEDY
X 代表 PCRE_EXTRA(從 PHP 7.3.0 起不再支援)
J 適用於 PCRE_INFO_JCHANGED

例如,(?im) 設定區分大小寫 (不區分大小寫)、多行匹配。也可以在字母前加上連字號來取消這些選項,例如 (?im-sx) 這樣的組合設定和取消設定,它設定了 PCRE_CASELESSPCRE_MULTILINE,同時取消設定 PCRE_DOTALLPCRE_EXTENDED,也是允許的。如果一個字母在連字號前後都出現,則該選項將被取消設定。

當選項變更發生在頂層(也就是不在子模式括號內)時,變更將應用於後續的模式。因此 /ab(?i)c/ 只匹配 "abc" 和 "abC"。

如果選項變更發生在子模式內,效果則不同。這是 Perl 5.005 的行為變更。子模式內的選項變更只影響其後面的子模式部分,因此 (a(?i)b)c 只匹配 "abc" 和 "aBc",而不匹配其他字串(假設未使用 PCRE_CASELESS)。通過這種方式,可以使選項在模式的不同部分具有不同的設定。在一個分支中所做的任何更改都會延續到同一個子模式中的後續分支。例如,(a(?i)b|c) 匹配 "ab"、"aB"、"c" 和 "C",即使在匹配 "C" 時,第一個分支在選項設定之前就被放棄了。這是因為選項設定的效果發生在編譯時。否則會有一些非常奇怪的行為。

PCRE 特定的選項 PCRE_UNGREEDYPCRE_EXTRA 可以像 Perl 相容選項一樣,分別使用字符 U 和 X 來更改。(?X) 旗標設定很特殊,它必須始終出現在模式中它啟用的任何附加功能之前,即使它位於頂層也是如此。最好將其放在開頭。

新增註釋

使用者提供的註釋 2 則註釋

mike at clove dot com
14 年前
當使用 (?i:foo) 語法時,該群組似乎不會包含在 'matches' 參數中,除非它嵌套在另一組括號中,例如:((?i:foo))
mati_ at zenbe dot com
15 年前
也可以僅在特定群組上啟用修飾符,這樣修飾符就不會一直有效到結束或使用 "(?-<modifier>)" 停用。

語法是在群組開頭使用 "?<modifier>:",例如 (?i:foo) 匹配 FoO。
To Top