我正在用PHP编写应用程序,我需要用<!-- *
中的对应元素替换* -->
和$vars
之间的任何单词。
例如,
<!-- *foobar* -->
在这种情况下,'foobar'必须由变量$vars["foobar"]
的值替换。这就是我现在所拥有的,但它不起作用(它总是返回<>
:():
preg_replace_callback("<!--(\s+)\*([a-zA-Z0-9]+)\*(\s+)-->", create_function('$matches', 'return $vars[$matches];'), $template);
任何人都可以帮助我吗?提前谢谢。
答案 0 :(得分:4)
请记住,如果不使用global关键字或使用$ GLOBALS,则不能使用$ vars。此外,如果您运行PHP 5.3,您可以使用匿名函数,而不会出现丑陋的全局黑客攻击:
$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', function($matches) use ($vars) { return $vars[$matches[1]]; }, $template);
在5.3之前,您可以这样做:
$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', create_function('$matches', 'return $GLOBALS["vars"][$matches[1]];'), $template);
如果你没有运行5.3但仍想避免全局变量,你可以这样做:
$template = preg_replace('/<!--\s+\*(\w+)\*\s+-->/e', '$vars["\1"]', $template);
答案 1 :(得分:1)
尝试:
create_function('$matches', 'return $vars[$matches[2]];')
因为第二组是你想要的那个。不知道为什么你要抓住其他人。同样对于这种事情,我倾向于选择全局而不是调用create_function()
。
此外,您没有使用/:
来划分正则表达式,例如此版本$vars = array(...);
preg_replace_callback('/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/', 'replace_var', $template);
function replace_var($matches) {
global $vars;
return $vars[$matches[1]];
}
答案 2 :(得分:0)
我认为你需要的是:
preg_replace_callback("/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/", create_function('$matches', 'return $vars[$matches[2]];'), $template);
$ matches变量是一个数组。索引0与整个正则表达式匹配,然后任何其他索引是正则表达式中的捕获组(如果有)。
在这种情况下,$ matches将如下所示:
array(2) {
[0]=>
string(18) "<!-- *example* -->"
[1]=>
string(7) "example"
}