开发者

What regex must I use?

I'm writing an application in PHP, and I need to replace any word between <!-- *开发者_如何学JAVA and * --> with it's correspondenting element in $vars. For example,

<!-- *foobar* -->

In this case 'foobar' must be replaced by the variable $vars["foobar"]'s value. This is what I have now, but it does not work (it always returns <> :( ):

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

Can anyone help me? Thanks in advance.


Remember that you can't use $vars without introducing at with global keyword or by using $GLOBALS. Also if you're running PHP 5.3, you can use an anonymous function without an ugly global hack:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', function($matches) use ($vars) { return $vars[$matches[1]]; }, $template);

In pre-5.3 you can do this:

$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', create_function('$matches', 'return $GLOBALS["vars"][$matches[1]];'), $template);

If you don't run 5.3 but still want to avoid global variable, you can do this:

$template = preg_replace('/<!--\s+\*(\w+)\*\s+-->/e', '$vars["\1"]', $template);


Try:

create_function('$matches', 'return $vars[$matches[2]];')

since the second group is the one you want. Not sure why you're capturing the others however. Also for this kind of thing I tend to prefer a global rather than calling create_function().

Also, you're not delimiting the regex, like this version with /:

$vars = array(...);
preg_replace_callback('/<!--\s+\*([a-zA-Z0-9]+)\*\s+-->/', 'replace_var', $template);

function replace_var($matches) {
  global $vars;
  return $vars[$matches[1]];
}


I think what you need is:

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

The $matches variable is an array. Index 0 is what matched the whole regex and then any further indexes are the capture groups (if any) in the regex.

In this case $matches will look like this:

array(2) {
  [0]=>
  string(18) "<!-- *example* -->"
  [1]=>
  string(7) "example"
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜