PHP 开发者大会日本 2024

内部选项设置

可以通过用“(?”和“)”括起来的Perl选项字母序列,在模式内部更改PCRE_CASELESSPCRE_MULTILINEPCRE_DOTALLPCRE_UNGREEDYPCRE_EXTRAPCRE_EXTENDED和PCRE_DUPNAMES的设置。选项字母是

内部选项字母
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 条笔记

3
mike at clove dot com
14 年前
使用 (?i:foo) 语法时,似乎除非将组嵌套在额外的括号中,例如:((?i:foo)),否则该组不会包含在“matches”参数中。
2
mati_ at zenbe dot com
15 年前
还可以选择仅对特定组启用修饰符,以便修饰符不会保持有效直到结束或使用“(?)”停用。

该语法的写法是在组的开头使用“?:”,即 (?i:foo) 匹配 FoO。
To Top