我已经编制了一份变更列表,这些变更可能是将pcre转换为pcre2时可能遇到的问题。我已经排除了各种溢出、下溢、分段违规和模式在pcre中可能遇到的各种错误。
Pcre2有一个版本检查模式。您可以使用/(?(VERSION>=10)yes|no)/
与"yesno"匹配来检查应用程序的版本。
模式如/()a/
未能设置“第一个字符必须是'a'”信息。例如/(?:(?=.)|(?<!x))a/
。
模式如/a\K.(?0)*/
匹配“abac”时,Perl和JIT找到“c”,而非“bac”。\K
的影响没有被正确传播。并非所有使用\K
的情况都会产生错误结果。
使用(*ACCEPT)
没有取消其他组捕获,导致ovector包含不正确的信息。例如/(x)|((*ACCEPT))/
与“abcd”匹配。
对于类似于在UTF模式下的/(?i)[A-`]/
的模式,大小写混合可能会将范围留出类外,在这种情况下,a-j被省略了。
当作为条件使用时,优化为(*FAIL)
的断言。例如(?(?!)a|b)
。
对于\8
和\9
,现在与Perl匹配。它们是反向引用,或者是字面字符“8”和“9”。
报告空子模式名称的错误,例如(?'')
。
重复非捕获组与匹配空字符串的条件组无法被识别为匹配空字符串。例如/^(?:(?(1)x|)+)+$()/.
EBCDIC环境的各种破坏性变化。
启用Unicode支持的PCRE2在类中使用\p
和\P
时未报告错误。
可能匹配空字符串的占有性重复条件组被错误地编译。例如/(?(R))*+/
。
如果后面跟随单个字符,则序列如[[:punct:]b]
会忽略POSIX类。
在UCP模式下,[:punct:]
匹配了128-255中不应匹配的字符。
否定类,例如[^[:^ascii:]\d]
和非否定类[:^ascii:]
或[:^xdigit:]
错误地包括所有大于255的码点。
在模式开头设置任何(?imsxJU)
选项不再传递到由PCRE2_INFO_ALLOPTIONS返回的选项中。
在量词符号中间使用\Q\E
,例如A+\Q\E+现在被忽略。
调用前的回调后面可以出现一个空的\Q\E
序列,但是它会被忽略。
现在可以在回顾断言中的组后使用{0}
。
PCRE2现在匹配perl,将(?(DEFINE)...)
视为“定义”组,即使存在名为“DEFINE”的组也是如此。
递归条件测试现在必须引用现有的子模式。例如(?(R2)...)
。
如果组名以“R”开头,则条件递归测试的使用方式不
\K
在环视内的行为。 - Casimir et Hippolyte-P
)和PHP 7.3已经从PCRE转移到PCRE2。 - Adam Katz