我正在尝试使用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>
我如何做到这一点,同时匹配开始和结束标签?
答案 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\>/