【发布时间】:2019-09-07 01:16:45
【问题描述】:
事实证明这两个序列(以前都有效)
"`([\n\A;]+)\/\*(.+?)\*\/`ism" => "$1", // error
"`([\n\A;\s]+)//(.+?)[\n\r]`ism" =>"$1\n", // error
现在在 PHP 7.3 中抛出一个错误
警告:preg_replace():编译失败:转义序列在字符类偏移量 4 中无效
CONTEXT:考虑这个片段,它从字符串中删除 CSS cmets
$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 - 任何想法在这种情况下 REGEX 有什么问题? 该线程似乎表明它只是一个放错位置的反斜杠 https://github.com/thujohn/twitter/issues/250
Q2 -这是 PHP 7.3 的错误还是此代码中的 REGEX 序列有问题?
【问题讨论】:
-
你想和
\A匹配什么?如果您使用 regex101.com 检查您的正则表达式,您会发现它甚至不匹配第一个字符类!正则表达式将与\w\s匹配,但我真的不知道这是否是您想要匹配的! -
您可能想将正则表达式放在单引号中。避免 PHP Escape 序列解释。
-
你能提取一个minimal reproducible example吗?此外,如果它适用于 7.2 但适用于 7.3,请查看发行说明。也许代码依赖于已修复的错误。
-
@slepic,使用单引号需要额外的步骤才能在其中获得换行符和回车符。特别是,在这种情况下,仅用单引号替换双引号会更改字符串内容。
-
如果在模式的开头添加
(*NO_JIT)会怎样?