使用RegEx匹配嵌套[quote]

时间:2010-03-03 18:27:07

标签: html regex bbcode

我正在尝试使用regexp来匹配某些嵌套标记。 (是的,我知道我应该使用解析器,但我的输入是正确的。)

示例:

Text.
More text.
[quote]
First quote
[quote]
Nested second quote.
[/quote]
[/quote]

假设我希望正则表达式只是将标记更改为<blockquote>

Text.
More text.
<blockquote>
First quote
<blockquote>
Nested second quote.
</blockquote>
</blockquote>

我如何做到这一点,同时匹配开始和结束标签?

4 个答案:

答案 0 :(得分:3)

如果您不介意正确性,那么您可以使用简单的字符串替换并单独替换每个标记。以下是使用PHP’s str_replace替换开始和结束标记的示例:

$str = str_replace('[quote]', '<blockquote>', $str);
$str = str_replace('[/quote]', '</blockquote>', $str);

或者在正则表达式的帮助下(再次使用PHP):

$str = preg_replace('~\[(/?)quote]~', '<$1blockquote>', $str);

此处\[(/?)quote]的匹配项被替换为<$1blockquote>,其中$1被替换为模式的第一组匹配((/?)/或空的)。

但是你应该使用一个跟踪开始和结束标签的解析器。否则,您可以使用没有对应的开始或结束标记,或者(如果您使用的是其他标记)没有正确嵌套的标记。

答案 1 :(得分:2)

You can't match (arbitrarily) nested stuff with regular expressions.

但您可以将[quote]的每个实例替换为<blockquote>,将[/quote]替换为</blockquote>

答案 2 :(得分:1)

这是一个糟糕的想法,但您显然正在尝试匹配以下内容:\[\(/?\)quote\]并将其替换为:<\1blockquote>

答案 3 :(得分:1)

您可以使用2个表达式。

s/\[quote\]/\<blockquote\>/
s/\[\/quote\]/\<\/blockquote\>/