有谁知道为什么这不起作用?致力于: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]);
}
当我们切换到 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]);
}