2011-09-10 8 views
4

は私が私が解析するために次の文字列を必要としている:私はbasicly次REGEXREGEXのネストされたパターンのサポート?

text = text.replace(/\[QUOTE=(.*?)]([\s\S]*?)\[\/QUOTE\]/gi, '<div class="quotes"><i>Quote by $1</i><br />$2</div>'); 
を使用して定型化されたdiv要素の中に[引用]領域を変換することにより、HTMLにBBコードのこのセットをconvernしようとしています

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

このコードは、QUOTESの最初のセットを正しく解析しますが、ネストされたレベルの引用は正しく解析しません。どのように私は表現をimpproveすることができますか?

+0

なぜ私はあなたがjavascriptでそれをやっているのか尋ねることはできますか? – yoda

+0

これには再帰的なアプローチが必要でしょう。引用符をオブジェクトとして読み込むのはどうですか(Quote $ author $ text $ subquotes ...)?そして、あなたが望む任意のフォーマットに出力することができます。 –

答えて

3

ネストされたレベルになると、入力の「通常の」性質が失われます。 HTML which is always a hard spot for regexesのように「context free」が増えます。

文字列をトークン化し、recursive descent parserのようにsomethinkで解析することをお勧めします。

+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>'); 

あなたのコードは、あまりにも動作しますが、あなたはそれを複数回適用する必要があります - この場合は2、しかし三重がある場合あなたは3つのパスを作る必要があります。

+0

欲張りな '。*'の時計... – jswolf19

関連する問題