有谁知道为什么这不起作用?致力于:preg_replace():不再支持 /e 修饰符,请使用 preg_replace_callback instea

Does anyone know why this isn't working? Working on: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instea

当我们切换到 php7 时,一个特定的 Wordpress 插件突然开始出现这个错误:

preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead.

所以我开始搜索(我不是 php 专家)并重写了调用。

肯定有问题(尽管错误消失了),因为插件没有完成这项工作。 有什么线索吗?谢谢

//old
//$rewrite_rules = unserialize( preg_replace         ( '!s:(\d+):"(.*?)";!se',                        "'s:'.strlen('').':\"\";'"         , $rewrite_rules ) );
//new
  $rewrite_rules = unserialize( preg_replace_callback( '!s:(\d+):"(.*?)";!s',  function($m) { return ("'s:'.strlen('$m[2]').':\"$m[2]\";'");}, $rewrite_rules ) );

您的回调有几个问题:

function($m) { return ("'s:'.strlen('$m[2]').':\"$m[2]\";'");}

最大的是returns字符串:

"'s:'.strlen('$m[2]').':\"$m[2]\";'"

作为一个用双引号括起来的字符串,变量被替换为它们的值,仅此而已。显然,您还需要找到 $m[2] 的长度,函数 strlen() 是完成这项工作的正确工具。但是这里的 strlen 只是字符串中的一些字符,而不是函数调用。为了正确调用 strlen() 以获得 $m[2] 的长度,它应该作为 PHP 代码在字符串之外调用,如下所示:

's:'.strlen($m[2]).':"'.$m[2].'";'

更好的是,使用 sprintf() 以干净的方式生成输出,而不必担心引号和引号内的转义引号等等:

function (array $m) {
    return sprintf('s:%d:"%s";', strlen($m[2]), $m[2]);
}