正确替换Deprecated:preg_replace():不推荐使用/ e修饰符,使用preg_replace_callback?

时间:2015-03-03 06:52:46

标签: php regex

我正在替换我的cms中的一些代码以准备php升级。

这是我要替换的代码:

$REQUEST_URI = preg_replace('#([\x3C\x3E])#e', '"%".bin2hex(\'\\1\')', $_SERVER['REQUEST_URI']);

这是我的替代品:

$REQUEST_URI = my_unicode_conv($_SERVER['REQUEST_URI']);
function my_unicode_conv($word) {
    return preg_replace_callback('/([\x3C\x3E])/',create_function ('$matches','return bin2hex($matches[1]);'), $word);
}

这些是等价的吗?我该如何测试这段代码?

1 个答案:

答案 0 :(得分:1)

通常不需要使用eval。让我们来看看这段代码到底做了什么。

首先\x表示UTF8字符特定为十六进制。对于任何数字< 7F这只是ASCII。因此,我们可以在ASCII table中轻松查找这些字符。

  • \x3C =“<”
  • \x3E =“>”

bin2hex函数将为这些字符提供十六进制表示(“3C”和“3E”)。

此外,eval在十六进制表示前添加“%”。

简而言之,任何“<”在REQUEST_URI中替换为“%3C”和“>”替换为“%3E”。

解决方案

我们可以简单地执行str_replace

,而不是使用preg_replace
$REQUEST_URI = str_replace(['<', '>'], ['%3C', '%3E'], $_SERVER['REQUEST_URI']);