为了账号安全,请及时绑定邮箱和手机立即绑定

通过 REGEX 删除 CSS 注释时出错

通过 REGEX 删除 CSS 注释时出错

PHP
慕哥9229398 2022-01-02 19:45:15
事实证明,这两个序列(以前有效)"`([\n\A;]+)\/\*(.+?)\*\/`ism" => "$1",     // error"`([\n\A;\s]+)//(.+?)[\n\r]`ism" =>"$1\n",  // error现在在 PHP 7.3 中抛出错误警告:preg_replace():编译失败:字符类偏移量 4 中的转义序列无效上下文:考虑这个 snipit,它从字符串中删除 CSS 注释$buffer = ".selector {color:#fff; } /* some comment to remove*/";$regex = array("`^([\t\s]+)`ism"=>'',"`^\/\*(.+?)\*\/`ism"=>"","`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1",     // 7.3 error"`([\n\A;\s]+)//(.+?)[\n\r]`ism"=>"$1\n", // 7.3 error"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n");$buffer = preg_replace(array_keys($regex),$regex,$buffer);//returns cleaned up $buffer value with pure css and no comments参考:https : //stackoverflow.com/a/1581063/1293658Q1 -在这种情况下,正则表达式有什么问题吗?这个线程似乎表明它只是一个错位的反斜杠 https://github.com/thujohn/twitter/issues/250Q2 -这是 PHP 7.3 错误还是此代码中的 REGEX 序列有问题?
查看完整描述

1 回答

?
LEATH

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在模式验证上更加严格,所以升级后,你现有的一些模式不能再编译了。


查看完整回答
反对 回复 2022-01-02
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信