通过 REGEX 删除 CSS 注释时出错

事实证明,这两个序列(以前有效)


"`([\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/1293658


Q1 -在这种情况下,正则表达式有什么问题吗?这个线程似乎表明它只是一个错位的反斜杠 https://github.com/thujohn/twitter/issues/250


Q2 -这是 PHP 7.3 错误还是此代码中的 REGEX 序列有问题?


慕哥9229398
浏览 131回答 1
1回答

LEATH

不要在字符类中使用零宽度断言。^, $, \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在模式验证上更加严格,所以升级后,你现有的一些模式不能再编译了。
打开App,查看更多内容
随时随地看视频慕课网APP