无法将带有修饰符 /e 的 preg_replace() 转换为 preg_replace_callback()

Can't convert preg_replace() with modifier /e to preg_replace_callback()

我正在使用 preg_replace(){#page} 替换为变量 $page 的实际值。当然我有很多{#variable},不只是{#page}.

例如:

$uri = "module/page/{#page}";
$page = 3;

//preg_replace that its working now
$uri_to_call = $uri_rule = preg_replace('/\{\#([A-Za-z_]+)\}/e', "$", $uri);

我得到了结果

"module/page/3";

更新到 PHP 5.4 后出现错误:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead

而且我不知道如何用 preg_replace_callback() 重写 preg_replace()

我试着按照 SO Replace preg_replace() e modifier with preg_replace_callback

的回答

像这样:

public static function replace_vars($uri) { //$uri_rule = preg_replace('/\{\#([A-Za-z_]+)\}/e', "$", $uri);
        return preg_replace_callback('/{\#([A-Za-z_]+)\}/', 
           create_function ('$matches', 'return $$matches[1];'), $uri);

    }

但我也收到警告:

Notice: Undefined variable: page

这实际上是正确的,因为它没有设置运行时创建函数的页面变量。

谁能帮帮我?

正如您所知,您的问题是您的变量超出了匿名函数的范围,并且由于您不知道要替换哪个变量,因此您无法将它们传递给函数,因此您必须使用 global 关键字,例如

$uri = "module/page/{#page}";
$page = 3;

$uri_to_call = $uri_rule = preg_replace_callback("/\{\#([A-Za-z_]+)\}/", function($m){
    global ${$m[1]};
    return ${$m[1]};
});