PHP不推荐使用:preg_replace():不推荐使用/ e修饰符,而是使用preg_replace_callback - 第58行

时间:2018-03-14 07:37:19

标签: php

我想知道是否有人可以帮我这个。

我们在错误日志中收到此错误:

  

[13-Mar-2018 16:42:40 UTC] PHP不推荐使用:preg_replace():/ e   不推荐使用修饰符,而是使用preg_replace_callback   第58行的public_html / check_requirements.php

check_requirements.php的第58行是:

$string = preg_replace('~&#0*([0-9]+);~e', 'chr(\\1)', $string);

我担心我们只是为其他人托管网站,而且由于最近的PHP升级,似乎发生了错误。

有谁知道如何更改代码的第58行来解决问题?

非常感谢你的帮助

詹姆斯

15/03/2018

谢谢Eydamos。我已经用你的建议替换了代码中的行

$string = preg_replace_callback(
'~&#0*([0-9]+);~',
function ($matches) {
    return chr($matches[1]);
},
$string
);

不幸的是,我再次加载了该网站并检查了错误日志,它提出了以下内容:

[15-Mar-2018 09:02:09 UTC] PHP不推荐使用:preg_replace():不推荐使用/ e修饰符,而是在第57行的public_html / check_requirements.php中使用preg_replace_callback

第57行是:

$string = preg_replace('~&#x0*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);

看起来你的第一个建议解决了这个问题,但另一个已经变得明显了。我也不确定我应该怎么做这件事。你介意看看我吗?如果有帮助,我可以粘贴整个代码。

我真的很感谢你对这个的帮助。这完全取决于我的专业领域 - 只是我们从一个旧网站继承的东西,我们已经接管了托管。

2 个答案:

答案 0 :(得分:2)

这是一个简单的修复,您只需将第二个参数转换为函数即可。像这样:

$string = preg_replace_callback(
    '~&#0*([0-9]+);~',
    function ($matches) {
        return chr($matches[1]);
    },
    $string
);

除此之外,您可以更轻松地归档相同的结果:

$string = html_entity_decode($string);

第二个就像第一个一样简单:

$string = preg_replace_callback(
    '~&#x0*([0-9a-f]+);~i',
    function ($matches) {
        return chr(hexdec($matches[1]));
    },
    $string
);

基本上你只需要做三个步骤:

  1. 在分隔符后删除字符'e'(在您的情况下'〜'是分隔符)
  2. 将第二个参数转换为函数。你只需返回第二个参数但没有引号的内容,所以像chr这样的函数将被称为
  3. 在函数中替换\\ 1,\\ 2,...与$ matches [1],$匹配[2]等等

答案 1 :(得分:-1)

根据PHP文档http://php.net/manual/en/reference.pcre.pattern.modifiers.php 'e'修饰符在5.5.0版本中已弃用,已从PHP 7中删除,因此如果您考虑升级到PHP 7,则应将代码替换为与文档类似的内容或@Eydamos提供的答案