将已弃用的 preg_replace /e 替换为 preg_replace_callback

$result = preg_replace(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/iseU", 
    "CallFunction('\\1','\\2','\\3','\\4','\\5')",
    $result
);

上面的代码在升级到 PHP 5.5 后给出了弃用警告:

已弃用:preg_replace():/e 修饰符已弃用,请改用 preg_replace_callback

如何将代码替换为 ?preg_replace_callback()


答案 1

您可以使用匿名函数将匹配项传递给函数:

$result = preg_replace_callback(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/isU",
    function($m) { return CallFunction($m[1], $m[2], $m[3], $m[4], $m[5]); },
    $result
);

除了更快之外,这还可以正确处理字符串中的双引号。您当前使用的代码会将双引号转换为 ./e"\"


答案 2

推荐