1 回答
TA贡献1936条经验 获得超6个赞
不要在字符类中使用零宽度断言。
^
,$
,\A
,\b
,\B
,\Z
,\z
,\G
-作为锚点,(非)词边界- 在字符类中没有意义,因为它们不匹配任何字符。该^
和\b
在字符类平均不同的东西:^
要么是如果打开之后使用的否定字符类的标记[
或表示文字^
。\b
表示退格字符。你不能
\R
在那里使用(=any line break),也不能。
\A
必须将字符类内部的两个模式重写为分组结构, (...)
,并带有交替运算符|
:
"`(\A|[\n;]+)/\*.+?\*/`s"=>"$1",
"`(\A|[;\s]+)//.+\R`"=>"$1\n",
我删除了您不使用的冗余修饰符和捕获组,并替换[\r\n]为\R. 该"`(\A|[\n;]+)/\*.+?\*/`s"=>"$1" 还可以重新写在一个更有效的方式:
"`(\A|[\n;]+)/\*[^*]*\*+(?:[^/*][^*]*\*+)*/`"=>"$1"
请注意,在 PHP 7.3 中,acc. 到捆绑的PCRE库表的升级历史,正则表达式库是PCRE 10.32。请参阅PCRE 到 PCRE2 迁移:
在 PHP 7.2 之前,PHP 使用旧版 PCRE 库的 8.x 版本,从 PHP 7.3 开始,PHP 将使用 PCRE2。请注意,尽管 PCRE2 基于 PCRE (8.x) 并在很大程度上与 PCRE (8.x) 兼容,但它仍被认为是一个新库。
累积 对于此资源,更新后的库对正则表达式模式更加严格,并且现在将以前宽容地接受的用户错误视为真正的错误:
默认情况下,修改器 S 现在处于启用状态。PCRE 做了一些额外的优化。
默认情况下禁用选项 X。它使 PCRE 比以前做更多的语法验证。
使用 Unicode 10,而使用 Unicode 7。这意味着更多表情符号、更多字符和更多集合。Unicode 正则表达式可能会受到影响。
一些无效的模式可能会受到影响。
简单来说,PCRE2在模式验证上更加严格,所以升级后,你现有的一些模式不能再编译了。
- 1 回答
- 0 关注
- 130 浏览
添加回答
举报