我刚刚更新了PHP在我的服务器从PHP 5到PHP 7,我得到了这些警告:
警告:preg_replace_callback()[function.preg-replace-callback0]:要求参数2“chr(\1)”是有效的回调
警告:preg\u replace\u callback()
警告:preg_replace_callback()[function.preg-replace-callback0]:要求参数2“chr(\1)”是有效的回调
警告:preg\u replace\u callback()
这是PHP代码:
private function _decode( $source )
{
$source = html_entity_decode($source, ENT_QUOTES, 'UTF-8');
$source = preg_replace_callback('/&#(\d+);/me',"chr(\\1)", $source);
$source = preg_replace_callback('/&#x([a-f0-9]+);/mei',"chr(0x\\1)", $source);
return $source;
}
警告来自:
$source = preg_replace_callback('/&#x([a-f0-9]+);/mei',"chr(0x\\1)", $source);
我怎样才能解决这个问题?
如PHP7.0迁移指南中所述,不再支持/e
修饰符(PREG\u REPLACE\u EVAL
)。您需要使用一个可调用函数,而不是将作为函数计算的字符串。在您的情况下,用闭包替换字符串函数--chr(0x\\1)
:
$source = preg_replace_callback(
'/&#x([a-f0-9]+);/mi',
fn($m) => chr(hexdec('0x'.$m[1])),
$source
);
内联字符串替换\\1
以生成有效的PHP十六进制,如0x21
,在可调用中不再以这种方式工作:您需要hexdec
调用来完成相同的操作。
在3v4l上查看它的实际操作。组织。
如果您还没有带有短闭包的PHP7.4,则需要将其编写为:
$source = preg_replace_callback(
'/&#x([a-f0-9]+);/mi',
function ($m) { return chr(hexdec('0x'.$m[1])); }, // Now a Closure
$source
);