2012-02-22 15 views
3

私はRORを使って基本的なディスカッションボードを作っています。ユーザがメッセージに応答を投稿すると、入力テキストエリアには、[QUOTE]タグを使用してメッセージが引用符で事前入力されます。このようなフォーマットがあるので:ネストされた開閉タグを見つける最も良い方法

[QUOTE]引用されたメッセージは、ここで[/ QUOTE]現在

を行く、私はを使用してHTMLで[QUOTE]と[/ QUOTE]を置き換えるシンプルなソリューションを持っています[QUOTE]または[/ QUOTE]がまだ存在する限り、message.sub( '[QUOTE]'、 'html goes here')引用されたメッセージに返信する場合は、HTMLを[QUOTE]タグに戻して、あらかじめ入力された入力テキストエリアにHTMLが含まれていないことを確認します。ここでは[QUOTE]こちら[QUOTE]引用されたメッセージは、[/ QUOTE] [/ QUOTE]

が問題である

:そのように、引用の引用は、次のようになります。私は再び私の現在のメソッドを実行すると、私のような重複HTMLフィールドを取得します:

<div class='test'><div class='test'>quoted message goes here</div></div> 

は代わりに、私は次のようになります解決策持つことができるようにしたい:

<div class='test1'><div class='test2'>quoted message goes here</div></div> 

などなどを... これをループする最善の方法に関する提案はありますか?ここで

答えて

5

あなたがgsub用ブロック法を使用する必要があります追跡深さをしたい場合:

text = "[QUOTE][QUOTE]quoted message here[/QUOTE][/QUOTE]" 

quote_level = 0 

new_text = text.gsub(/\[\/?QUOTE\]/) do |m| 
    case (m) 
    when '[QUOTE]' 
    quote_level += 1 
    "<div class='test#{quote_level}'>" 
    when '[/QUOTE]' 
    quote_level -= 1 
    "</div>" 
    end 
end 

puts new_text.inspect 
# => "<div class='test1'><div class='test2'>quoted message here</div></div>" 

無効ネスティングペアを取り扱うときは、これをより堅牢にすることができ、うまくフォーマットされたタグの場合、これはうまくいくはずです。

+0

これは完璧に見える!あなたがそれを述べたので、私はあなたがこの解決策を使って無効なネスティングペアに近づく方法が不思議ですか? – Marc

+1

あなたは 'quote_level'がいつでもゼロ以下にならないようにする必要があります。つまり、あまりにも多く閉じたことを意味し、変換の最後には正確に' 0'です閉じられていないタグを持つ – tadman

1

はアイデアです:

(\[QUOTE\])(.*?)(\[\/QUOTE\]) 

この正規表現を取り、あなたの文字列に適用します。開始タグ、終了タグ、内容と一致します。その後、コンテンツを取得し、正規表現を再度適用します。一致するものがあれば、それはネスティングの第2レベルになります。一致している間に繰り返します。

ここにデモ:http://rubular.com/r/MkGsnUj3vL

+1

@tadman:まあ、私はこれを知っていた!ありがとう、仲間:) –

+0

私はあなたの例を確認し、私はそれが偶然によってのみ動作すると思います。それをわずかに変更すると、 '。*'グリーディ・マッチャーが使用され、真っ暗な '... [/ QUOTE] [QUOTE] ...'のペアが中央に残されます。 '。*?'は一般にネストされたペアを捕捉することがあまり良くないとしてもマッチングを行うより安全な方法です。 – tadman

+1

正規表現を '(\ [QUOTE \])(?!\ [QUOTE \])(。*?)(\ [\/QUOTE \])'に更新してください。追加された否定先読みに注意してください。このようにして、あなたは二つの開いた '[QUOTE]'を一つの閉じ ''/QUOTE ''にマッチさせません。 (最初の一致が返されました) – Luke

関連する問題