2017-07-07 88 views
0

我从PHP 5我的服务器上刚刚更新了PHP到PHP 7和我得到这些警告:警告:preg_replace_callback():需要参数2

警告:preg_replace_callback()[function.preg替换-callback0]:需要参数2'chr(\ 1)'为有效回调

警告:preg_replace_callback()[function.preg-replace-callback0]:需要参数2,'chr(0x \ 1 )',成为一个有效的回调

警告:preg_replace_callback()[function.preg-replace-callback0]:需要参数2,'chr(\ 1)',作为一个VA盖回调

警告:preg_replace_callback()[function.preg替换-callback0]:要求参数2, 'CHR(0X \ 1)',是一个有效的回调

这是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); 

我怎么能解决这个问题?

回答

1

不再支持/e修饰符(PREG_REPLACE_EVAL),如the PHP 7.0 migration guide中所述。您需要使用可调用的函数,而不是将作为函数进行评估的字符串。

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

内联字符串替换的\\1产生一个有效的PHP十六进制,像0x21,不再适用于可调用的那样:你有结束 - 在你的情况,你的替换字符串函数 - chr(0x\\1)需要拨打hexdec来完成相同的操作。

See it in action on 3v4l.org.

+0

工作!但现在我从$ source = preg_replace_callback('/&#(\ d +);/me',“chr(\\ 1)”,$ source);我如何解决这个问题?谢谢 –

+1

@MateiZoc完全一样。查看使用的代码并尝试将功能复制到其他方法。你实际上只需要复制该行,替换正则表达式并替换'chr'返回的内容。你甚至不需要使用十六进制,因为它是十进制数。 – h2ooooooo

+0

@ h2ooooooo我试试$ source = preg_replace_callback( '/&#(\ d +);/me', function($ m){return chr(hexdec($ m [1]));},// Now a Closure $ source );但我得到错误警告:preg_replace_callback()[function.preg-replace-callback0]:不再支持/ e修饰符,请使用preg_replace_callback而不是 警告:preg_replace_callback()[function.preg-replace-callback0]:/e修饰符不再支持,请使用preg_replace_callback代替 –

相关问题