preg_replace未替换正则表达式标签


preg_replace regex tags not being replaced

希望你能帮上忙。正则表达式很新,虽然我已经写了这个正则表达式,但它似乎不匹配。我没有收到错误消息,所以我假设语法正确,但它只是没有应用?

我希望正则表达式替换诸如

{foo}bar{/foo} with 酒吧

这是我的代码:

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

希望有人能帮忙。不知道为什么它似乎不起作用。

感谢您的阅读。

您的正则表达式确实有效,但是它不够聪明,无法知道结束标签必须与开始标签相同。我会改用这个。我也简化了一点:

$regex = '#{([^}]*)}(.*?)'{/''1}#';
echo preg_replace('{foo}bar{/foo}', '$2', $str); // outputs "bar"

代码板

参考我上面的评论:

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

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

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