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

时间:2017-01-18 09:42:49

标签: php wordpress preg-replace php-7 preg-replace-callback

当我们突然切换到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('$2').':\"$2\";'"         , $rewrite_rules ) );
//new
  $rewrite_rules = unserialize( preg_replace_callback( '!s:(\d+):"(.*?)";!s',  function($m) { return ("'s:'.strlen('$m[2]').':\"$m[2]\";'");}, $rewrite_rules ) );

1 个答案:

答案 0 :(得分:0)

您的回调有几个问题:

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

最大的一点是它返回字符串:

"'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]);
}