使用 (?i:foo) 语法时,似乎该组不会包含在“matches”参数中,除非它嵌套在另一组括号中,例如:((?i:foo))
可以通过在“(?”和“)”之间用一串 Perl 选项字母包围来更改 PCRE_CASELESS、PCRE_MULTILINE、PCRE_DOTALL、PCRE_UNGREEDY、PCRE_EXTRA、PCRE_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_CASELESS 和 PCRE_MULTILINE,同时取消了 PCRE_DOTALL 和 PCRE_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_UNGREEDY 和 PCRE_EXTRA 可以通过使用字符 U 和 X 分别以与 Perl 兼容的选项相同的方式进行更改。(?X) 标志设置很特殊,因为它必须始终早于它开启的任何附加功能出现在模式中,即使它处于顶层。最好将其放在开头。
还可以选择仅对特定组启用修饰符,这样修饰符不会一直有效到结束或通过“(?-<modifier>)”禁用。
该语法的格式是在组的开头使用“?<modifier>:” ,例如 (?i:foo) 匹配 FoO。