2010-03-03 66 views
0

我試圖讓正則表達式匹配一些嵌套標籤。 (是的,我知道我應該使用解析器,但我的輸入將是正確的)。使用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> 

我怎麼會做這個,配套都開始和結束標記在同一時間?

回答

2

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

但是你可以用<blockquote>[/quote]</blockquote>取代的[quote]每個實例。

+2

警告:您可以將嵌套內容與預定深度進行匹配:http://blog.stevenlevithan.com/archives/regex-recursion – ghoppe 2010-03-03 18:42:58

+0

「您無法使用正則表達式匹配(任意)嵌套內容。」 這就是我正在尋找的答案:) 所以我用了一個BBCode解析器: http://nbbc.sourceforge.net/ – soupagain 2010-03-10 11:13:45

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被第一組模式((/?)/或空)的匹配替換。

但是你應該真的使用一個解析器來跟蹤開始和結束標籤。否則,您可以打開或關閉沒有對應標籤的標籤,或者(如果您使用更多標籤)沒有正確嵌套。

+0

你確定OP想要PHP嗎? – kennytm 2010-03-03 18:40:28

+0

@KennyTM:啊,謝謝你的評論。我不知道我是如何假設他想使用PHP。 – Gumbo 2010-03-03 18:50:59

1

這是一個糟糕的主意,但你顯然試圖匹配是這樣的:\[\(/?\)quote\]並將其替換爲:<\1blockquote>

1

你可以使用2個表達式。

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