preg_replace正则表达式标记未被替换

时间:2012-06-02 23:55:33

标签: php regex preg-replace

希望你能提供帮助。正则表达式相当新,虽然我写了这个正则表达式,它似乎并不匹配。我没有收到错误消息所以我假设语法是正确的,但它只是没有被应用?

我希望正则表达式替换像

这样的内容
  

{foo} bar {/ foo} with   的

这是我的代码:

$regex = "#([{].*?[}])(.*?)([{]/.*?[}])#e";
$return = preg_replace($regex,"('$2')",$return);

希望有人可以提供帮助。不知道为什么它似乎不起作用。

感谢阅读。

2 个答案:

答案 0 :(得分:3)

你的正则表达式does work,但知道结束标记必须与开始标记相同是不够智能的。我会改用它。我也简化了一点:

$regex = '#{([^}]*)}(.*?)\{/\\1}#';

echo preg_replace('{foo}bar{/foo}', '$2', $str); // outputs "bar"

Codepad

答案 1 :(得分:2)

参考上面的评论:

#(?:[{](.*?)[}])(.*?)(?:[{]/\1[}])#

使用反向引用来保持标记相等。另外,我使用了非捕获括号来保留无用的组:$1将是标记名称,$2将是标记内容。

请注意,如果您的标签可以嵌套,则必须多次应用替换。