警告:preg_replace_callback():需要参数 2

Warning: preg_replace_callback(): Requires argument 2

我刚刚将服务器上的 PHP 从 php 5 更新为 php 7,我收到了这些警告:

Warning: preg_replace_callback() [function.preg-replace-callback0]: Requires argument 2, 'chr()', to be a valid callback

Warning: preg_replace_callback() [function.preg-replace-callback0]: Requires argument 2, 'chr(0x)', to be a valid callback

Warning: preg_replace_callback() [function.preg-replace-callback0]: Requires argument 2, 'chr()', to be a valid callback

Warning: preg_replace_callback() [function.preg-replace-callback0]: Requires argument 2, 'chr(0x)', to be a valid 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);

我该如何解决这个问题?

不再支持 /e 修饰符 (PREG_REPLACE_EVAL),如 the PHP 7.0 migration guide 中所述。您需要使用可调用函数,而不是将被评估为函数的字符串。在您的情况下,将您的字符串函数 - chr(0x\1) - 替换为 Closure:

$source = preg_replace_callback(
    '/&#x([a-f0-9]+);/mi',
    fn($m) => chr(hexdec('0x'.$m[1])),
    $source
);

\1 的内联字符串替换以产生有效的 PHP 十六进制,如 0x21,在可调用文件中不再以这种方式工作:你需要一个 hexdec打电话来完成同样的事情。

See it in action on 3v4l.org.


如果您还没有 PHP 7.4 短闭包,您需要将其写为:

$source = preg_replace_callback(
    '/&#x([a-f0-9]+);/mi',
    function ($m) { return chr(hexdec('0x'.$m[1])); }, // Now a Closure
    $source
);