1

別の質問のおかげで: Javascript を使用してテキストエリアから BBcode を削除する
と、これを作成できました: http://jsfiddle.net/hVgAh/1/

 text = $('textarea').val();
while (text.match(/\[quote.*\[\/quote\]/i) != null) {
   //remove the least inside the innermost found quote tags 
   text = text.replace(/^(.*)\[quote.*?\[\/quote\](.*)$/gmi, '\$1\$2');
}
text = text.replace(/\[\/?[^\[\]]+\]/gmi,'');
// now strip anything non-character
//text = text.replace(/[^a-z0-9]/gmi, '');
  char = text.length;
  $('div').text(text);

このコードは引用 bbcode (および他の BBcode も同様) を削除しますが、最も深い引用の内容、または最後に表示される qoute のみを削除します。この理由は、正規表現が貪欲だからだと思います。しかし、追加して貪欲にならないようにしようとしましたが、うまくいきませんでした?: http://jsfiddle.net/hVgAh/2/

引用符とその内容をすべて削除する必要があります。どうやってやるの?

4

2 に答える 2

1

改行を削除する必要はありません。改行を含む任意の文字に一致させる[\s\S]には、代わりに..

mアンカータグを作成し、文字列全体ではなく行の最初と最後に一致させる^multiline $modifier も不要です。

match繰り返しの呼び出しも回避するソリューションを次に示します。

var t;
while ( t != text ) {
    t = text;
    //text = text.replace( /\[quote(?:(?!\[quote)[\s\S])+?\[\/quote\]/g, '' );
    text = text.replace( /^([\s\S]*)\[quote[\s\S]+?\[\/quote\]/g, '$1');
}

コメントアウトされた行は、同様にうまく機能する代替バージョンです。

貪欲な一致の代わりに、否定的な先読みを使用して、最も深い引用タグのみが一致するようにします。[\s\S]これは、引用符タグ間のすべての文字が一致する前に先読みし、出現した場合は一致を防止するように、括弧で囲まれてい[quoteます。

どちらがより効率的かを言うのは難しいです。

JSFIDDLEを参照してください。

于 2013-02-19T19:55:07.420 に答える
0

問題は貪欲さではありませんでしたが、その置換は修飾子を使用しても改行を超えませんでしたm。改行を何も置き換えなかったので、テキストエリア全体が1行になり、突然魅力的に機能しました。

text = $('textarea').val();
text = text.replace(/(\r\n|\n|\r)/gmi, '');
while (text.match(/\[quote.*\[\/quote\]/i) != null) {
    //remove the least inside the innermost found quote tags 
    text = text.replace(/^(.*)\[quote.*?\[\/quote\](.*)$/gmi, '\$1\$2');
}
text = text.replace(/\[\/?[^\[\]]+\]/gmi, '');
text = text.replace(/[^a-z0-9]/gmi, ''); 

http://jsfiddle.net/NaGel182/dJvuZ/

于 2013-02-19T15:34:40.970 に答える