PHP的正则流派

PHP's Regex Flavor

表10-1:PHP preg的正则流派 PHP的正则流派 - 图1

前页的表10-1简要介绍了preg引擎的正则流派。下面是补充说明:

① 只有在字符组内部,\b才表示退格符。在其他场合,\b匹配单词分界符(☞133)。

十进制转义只能使用两到三位八位数值。特殊的一位数\0序列匹配空字节(NUL byte)。

「\xhex容许出现一到两位十六进制数字,而\x{hex}容许任意多个数字。请注意,大于\x{FF}的数值只能与模式修饰符u连用(☞447)。如果没有模式修饰符u,大于\x{FF}的值会导致正则表达式非法。

② 即使是在UTF-8模式下(通过模式修饰符u),单词分界符和字符组简记法,例如\w,也只对ASCII字符起作用。如果需要处理所有的Unicode字符,请使用\pL(☞121)代替\w,用\pN代替\d,用\pZ代替\s

③ Unicode支持针对Unicode Version 4.1.0。

Unicode字母表(☞122)的支持不需要任何‘Is’或者‘In’前缀,例如\p{Cyrillic}

PHP 同时支持单字母或双字母Unicode 属性,例如\p{Lu}\p{L},其中\pL作为单字母属性名(☞121)。而不支持\p{Letter}之类的长名称。

PHP也支持特殊的\p{L&}(☞121),以及\p{Any}(表示任意字符)。

④ 在默认情况下,preg 套件的正则表达式是以字节为单位的,所以\C默认就等价于「(?s:.),由 s修饰的点号。不过,如果使用了修饰符 u,则preg 套件就会以UTF-8字母为单位,也就是说,一个字符可能由6个字节组成。即使这样,\C仍然匹配单个字节。请参考第120页的注意事项。

\z\Z都能够匹配字符串的末尾,而\Z同样能够匹配最后的换行符。

「$的意义取决于模式修饰符m和D(☞446):如果没有设定任何修饰符,$等价于\Z(在字符串结尾的换行符,或者是字符串结尾);如果使用了 m,则它能够匹配内嵌的换行符,如果使用了模式修饰符 D,它能够匹配\z(只有在字符串的结尾)。如果同时设置了m和D,则忽略D。

⑥ 逆序环视中使用的子表达式只能匹配固定长度的文本,除非顶层多选分支容许不同的固定长度(☞133)。

⑦ 模式修饰符x(自由格式和注释)只能识别ASCII的空白字符,不能识别Unicode中的空白字符。