0

我试图让正则表达式匹配一些嵌套标签。(是的,我知道我应该使用解析器,但我的输入是正确的)。

例子:

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

4 回答 4

3

如果您不介意正确性,那么您可以使用简单的字符串替换并分别替换每个标签。下面是一些使用PHPstr_replace替换开始和结束标签的示例:

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

或者借助正则表达式(再次是 PHP):

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

这里的匹配\[(/?)quote]被替换为<$1blockquote>where$1被替换为模式的第一组的匹配((/?),要么/或空)。

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

于 2010-03-03T18:33:39.800 回答
2

你不能用正则表达式匹配(任意)嵌套的东西。

[quote]但是您可以替换with<blockquote>[/quote]with的每个实例</blockquote>

于 2010-03-03T18:34:22.073 回答
1

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

于 2010-03-03T18:35:55.660 回答
1

您可以使用 2 个表达式。

s/\[quote\]/\<blockquote\>/
s/\[\/quote\]/\<\/blockquote\>/
于 2010-03-03T18:38:07.873 回答