2011-09-10 175 views
4

我有以下字符串我需要解析:REGEX幫助嵌套模式?

[QUOTE=Mark] 
    [QUOTE=Jack] 
    How are you doing Mark? 
    [/QUOTE] 
Good to hear from you Jack, Im doing fine! 
[/QUOTE] 

我basicly嘗試使用下面的正則表達式

text = text.replace(/\[QUOTE=(.*?)]([\s\S]*?)\[\/QUOTE\]/gi, '<div class="quotes"><i>Quote by $1</i><br />$2</div>'); 
轉換[報價]地區進入程式化的DIV這套BB代碼的convern成HTML

此代碼將正確解析出第一組QUOTES,但不是嵌套級別的引號。任何想法如何我可以改變表達?

+0

我可以問爲什麼你用javascript做到這一點? – yoda

+0

你可能需要一個遞歸的方法。如何加載您的報價作爲對象(Quote $作者$文本$ subquotes ...)?然後你可以輸出你想要的任何格式。 –

回答

3

當您進入嵌套級別時,將失去輸入的「常規」特性。它變得更像「context free」,如HTML which is always a hard spot for regexes

我建議你標記字符串並用一些像recursive descent parser這樣的想法來解析它。

+0

'PCRE -PHP'中的'Atomic Grouping'是否解決了這個問題(以及?)?只是好奇:) – yoda

+0

@yoda:不是原子分組,但它使用正則表達式在PHP中解析嵌套BB是微不足道的。事情是,他正在使用JS(據我所知,它的正則表達式遠不如那些強大的正則表達式)。 – NikiC

4

如果這就是你在做什麼,解決的辦法是要簡單得多:

text = text.replace(/\[QUOTE=(.*?)\]/gi, 
        '<div class="quotes"><i>Quote by $1</i><br />'); 
text = text.replace(/\[\/QUOTE\]/gi, '</div>'); 

你的代碼工作過,但你必須多次運用它 - 在這種情況下,兩個,但如果有三重你必須進行三次通過,等等。

+0

注意貪婪的'。*'... – jswolf19