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

时间:2015-05-19 13:46:05

标签: php regex preg-replace 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', "$$1", $uri);

我得到了结果

"module/page/3";

更新到PHP 5.4后,我收到错误:

  

不推荐使用:preg_replace():不推荐使用/ e修饰符,而是使用preg_replace_callback

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

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

的回答

像这样:

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

    }

但我也收到警告:

  

注意:未定义的变量:page

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

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

您的问题就像您已经知道的那样,您的变量超出了匿名函数的范围,并且由于您不知道要替换哪一个,因此无法将它们传递给函数,因此您必须使用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]};
});