0

JavaScript(jQueryも使用)でユーザー側でフォームバリデーションを行いたいです。目標は、ネストされた bbCode[quote]タグをレベル 2 より深く削除することです。次のテキストがあるとします。

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

そして、これを取得します:

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

私の唯一のアイデアは、.replace[quote]で.replace を<div>作成し、DOM オブジェクトを作成し、jQuery で 2 よりも深いものをすべて削除し、すべてを bbCode に逆方向に解析することです。しかし、そのソリューションは複雑すぎるようです。もっとエレガントなソリューションはありますか?

編集:

素敵な解決策をありがとう。daroo の答えに基づいて、私はこれを行いました:

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

これはうまく機能します。

しかし、idealmachine のソリューションは閃光のようでした。以前はコールバック関数のパラメーターの置換について知りませんでしたが、今では便利です! 私はそれで解決します。

4

2 に答える 2

2

実際には、ネスト自体を処理できない限定的なツールと見なす場合、regex を使用できます。.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 がゼロを下回らないようにするコードを追加できます。

于 2010-11-26T09:15:15.493 に答える
1

通常の配列をスタックとして使用します。に遭遇するたびに、そのメソッド[quote]を使用して配列を 1 ずつ増やします。push()に遭遇したら、そのメソッド[/quote]を使用して配列を 1 つ減らします。pop()

遭遇[quote]し、配列の長さが 2 の場合は[quote]、それを削除し、次に[/quote]遭遇したものを削除します。

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

于 2010-11-26T08:26:36.413 に答える