2011-09-10 141 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