我必须使用什么正则表达式?

时间:2009-10-27 13:55:19

标签: php regex

我正在用PHP编写应用程序,我需要用<!-- *中的对应元素替换* -->$vars之间的任何单词。 例如,

<!-- *foobar* -->

在这种情况下,'foobar'必须由变量$vars["foobar"]的值替换。这就是我现在所拥有的,但它不起作用(它总是返回<> :():

preg_replace_callback("<!--(\s+)\*([a-zA-Z0-9]+)\*(\s+)-->", create_function('$matches', 'return $vars[$matches];'), $template);

任何人都可以帮助我吗?提前谢谢。

3 个答案:

答案 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"
}