2010-11-26 11 views
0

JavaScriptでユーザー側でフォームの検証を行いたい(jQueryも使用されています)。 、私の唯一のアイデアは<div>[quote]を.replaceすることですJavaScript:ネストされた[引用]を見つけよう

[quote=SoundMAX][quote=Laplundik] 
blahblah 
[/quote] 
blah[/quote] 

:目標は[quote]タグより深いレベル2と言うよりも、ネストされたBBコードを削除することで、我々はこのテキストがあります。

[quote=SoundMAX][quote=Laplundik][quote=SoundMAX] 
blahblahblah[/quote] 
blahblah 
[/quote] 
blah[/quote] 

をそしてこれを取得します次にDOMオブジェクトを作成し、jQueryで2より深いものを削除し、すべて逆向きに解析してbbCodeにします。しかし、その解決策は複雑すぎるようですが、よりエレガントなものがありますか?

EDIT:すてきなソリューションのための

感謝。ダリオの答えに基づいて、私はこれをしました:

var text=$('#edit-privatemsgbody').val(); 
var tmp=[]; 
var level=0; 

for (var i=0,l=text.length;i<l;i++){ 
if(text[i]=='['&&text[i+1]=='q') level++; 
if(text[i-6]=='q'&&text[i-7]=='/'&&text[i-8]=='[') level--; 
if(level<3) tmp.push(text[i]); 
} 
alert(tmp.join('')); 

うまく動作します。

しかし理想的な装置の溶液はフラッシュのようでした。前にコールバック関数のパラメータを置き換えることについてはわかりませんでしたが、今は便利です!私はそれで解決します。

+0

*正規表現ではありません:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – PleaseStand

+0

@idealmachine:それが私です別の解決策を求めている。 –

答えて

2

実際には、ネスト自体を処理できない限られたツールとして見れば、正規表現を使用できます。 .replace文字列メソッドは、私たちがマークアップ構造(コードもhttp://jsfiddle.net/Zbgr3/3/に掲載)であるかを深く追跡することができ、各試合のための置換テキストを、見つけるために、関数を呼び出すことができます。

var quoteLevel = 0; 

alert(s.replace(/\[(\/?)quote[^\]]*\]|./gi, function(tag, slash) { 
    // Opening tag? 
    if(tag.length > 1 && !slash.length) quoteLevel += 1; 
    // What to strip 
    var strip = quoteLevel > 2; 
    // Closing tag? 
    if(tag.length > 1 && slash.length) quoteLevel -= 1; 

    if(strip) return ''; 
    return tag; 
})); 

をあなたには、いくつかの許容範囲をしたい場合マークアップのエラーについては、たとえば、quoteLevelがゼロ以下にならないようにするためのコードを追加することができます。

1

通常の配列をスタックとして使用します。 [quote]が出現するたびに、push()メソッドを使用して配列を1つ増やします。 [/quote]が発生した場合は、pop()メソッドを使用して配列を1つ減らしてください。

[quote]が表示され、配列の長さが2の場合は、その[quote]を削除し、次に表示される[/quote]を削除してください。

オープンクーポンとクローズドクォートの数が同じでない場合は、適切な方法でそれを処理する必要があります。

関連する問題