当我们突然切换到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 ) );
答案 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]);
}