需要正则表达式来grep引用标记

时间:2011-10-03 16:25:25

标签: php regex replace preg-replace bbcode

我需要正则表达式来改变preg_replace:

[quote](content)[/quote]加入<blockquote>(content)</blockquote>

+

[quote=(username)][/quote]加入<blockquote>Post user: (username)</blockquote>

+

[quote=(username);(id)][/quote]加入<blockquote>Post user: (username).<br/>ID: (id)</blockquote>

当然,(内容),(用户名),(id)应该是正则表达式grep的那些。 我搜索了很多,并没有为这个动作找到任何好的正则表达式。所以,请帮帮我们。

1 个答案:

答案 0 :(得分:2)

我会用3个单独的正则表达式来做,因为如果你试图将两个条件放在一个正则表达式中,它会变成一个巨大的混乱。

preg_replace('#\[quote\](.+?)\[/quote\]#', '<blockquote>$1</blockquote>', $input);
preg_replace('#\[quote=(.+?)\]\[/quote\]#', '<blockquote>Post user: $1</blockquote>', $input);
preg_replace('#\[quote=(.+?);(.+?)\]\[/quote\]#', '<blockquote>Post user: $1.<br\>ID: $2</blockquote>', $input);

当然,这是逐字回答你的问题。你似乎忘记了后两个例子中的(内容)。

编辑:如果您确实只想使用一次preg_replace调用,则可以创建包含这些模式和替换的数组,如第二个示例here中所示。< / p>

编辑2: BBCode是否支持嵌套报价块?如果是这样,这会有点复杂。

编辑3:更简单的方法。由于[/quote]始终指向</blockquote>,因此您可以跳过所有此捕获组的废话,只需单独替换打开和关闭标记:

preg_replace('#\[quote\]#', '<blockquote>', $input);
preg_replace('#\[quote=(.+?)\]#', '<blockquote>Post user: $1>', $input);
preg_replace('#\[quote=(.+?);(.+?)\]#', '<blockquote>Post user: $1.<br\>ID: $2', $input);
preg_replace('#\[/quote\]#', '</blockquote>', $input);