我正在使用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
这实际上是正确的,因为页面变量没有设置运行时创建的函数。
任何人都可以帮助我吗?
答案 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]};
});