模式修饰符

目前可用的 PCRE 修饰符如下所示。括号中的名称是这些修饰符的内部 PCRE 名称。 修饰符中的空格和换行符会被忽略,其他字符会引发错误。

i (PCRE_CASELESS)
如果设置了这个修饰符,模式中的字母会匹配大小写字母。
m (PCRE_MULTILINE)
默认情况下,PCRE 将主题字符串视为由单个 "行" 字符组成的字符串(即使实际上包含多个换行符)。 "行首" 元字符 (^) 仅在字符串的开头匹配,而 "行尾" 元字符 ($) 仅在字符串的结尾或终止换行符之前匹配 (除非设置了 D 修饰符)。 这与 Perl 相同。 当设置了这个修饰符时,"行首" 和 "行尾" 元字符会在主题字符串中的每个换行符之后或之前立即匹配。 这等效于 Perl 的 /m 修饰符。如果主题字符串中没有 "\n" 字符,或者模式中没有 "^" 或 "$" 的出现, 设置这个修饰符不会产生任何效果。
s (PCRE_DOTALL)
如果设置了这个修饰符,模式中的点元字符将匹配所有字符,包括换行符。如果没有设置这个修饰符, 换行符会被排除在外。这个修饰符等效于 Perl 的 /s 修饰符。负类(如 [^a])总是匹配换行符, 与这个修饰符的设置无关。
x (PCRE_EXTENDED)
如果设置了这个修饰符,模式中的空白数据字符会被完全忽略,除非被转义或在字符类内部, 并且在一个未转义的 "#" 和下一个换行符之间的字符也会被忽略。这等效于 Perl 的 /x 修饰符, 并且使得在复杂模式中包含评论成为可能。然而,这仅适用于数据字符。空白字符永远不会出现在模式中的特殊字符序列中, 例如在引入条件子模式的序列 (?( 中。
A (PCRE_ANCHORED)
如果设置了这个修饰符,模式会被强制为 "锚定",也就是说,它只能匹配主题字符串的开头。 这个效果也可以通过模式本身中的适当构造来实现,这是在 Perl 中唯一的方法。
D (PCRE_DOLLAR_ENDONLY)
如果设置了这个修饰符,模式中的美元元字符只能匹配主题字符串的结尾。 如果没有设置这个修饰符,美元元字符也会在主题字符串的最后一个字符之前立即匹配,但不会在其他换行符之前匹配。 如果设置了 m 修饰符,这个修饰符会被忽略。在 Perl 中没有这个修饰符的等效项。
S
当一个模式将被多次使用时,值得花费更多时间来分析它,以加快匹配所需的时间。 如果设置了这个修饰符,那么会执行额外的分析。 目前,对于不具有单个固定起始字符的非锚定模式,研究模式是有用的。 从 PHP 7.3.0 开始,这个修饰符没有效果。
U (PCRE_UNGREEDY)
这个修饰符反转了量词的 "贪婪性",使其默认情况下不贪婪,但如果后面跟着 ?,则变为贪婪。 它与 Perl 不兼容。也可以通过模式内的 (?U)修饰符设置 或在量词后面加上问号(例如 .*?)来设置。

注意:

在不贪婪模式下,通常不可能匹配超过 pcre.backtrack_limit 个字符。

X (PCRE_EXTRA)
这个修饰符打开了 PCRE 的额外功能,这些功能与 Perl 不兼容。模式中的任何反斜杠后跟一个没有特殊含义的字母的组合都会引发错误, 从而为将来的扩展保留这些组合。默认情况下,与 Perl 一样,反斜杠后跟一个没有特殊含义的字母会被视为字面量。 目前没有其他受这个修饰符控制的功能。
J (PCRE_INFO_JCHANGED)
这个内部修饰符 (?J) 改变了本地 PCRE_DUPNAMES 选项。 允许子模式名称重复。 从 PHP 7.2.0 开始,J 也作为修饰符支持。
u (PCRE_UTF8)
这个修饰符打开了 PCRE 的额外功能,这些功能与 Perl 不兼容。模式和主题字符串被视为 UTF-8。 无效的主题字符串会导致 preg_* 函数匹配不到任何内容;无效的模式会触发一个 E_WARNING 级别的错误。 五个和六个字节的 UTF-8 序列被视为无效。
n (PCRE_NO_AUTO_CAPTURE)
这个修饰符使简单的 (xyz) 组不捕获。 只有像 (?<name>xyz) 这样的命名组才会捕获。 这只影响哪些组是捕获的,仍然可以使用编号的子模式引用,匹配数组仍然包含编号的结果。 从 PHP 8.2.0 开始可用。