文字列内のBBCodeを取り除くには、正規表現が必要です。私は次のもの(そしてタグ付きの配列)を持っています:
new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');
[tag] this [/ tag]は問題なく取得されますが、[url = http://google.com] this[/url]を使用すると失敗します。
何を変更する必要がありますか?どうもありがとう。
文字列内のBBCodeを取り除くには、正規表現が必要です。私は次のもの(そしてタグ付きの配列)を持っています:
new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');
[tag] this [/ tag]は問題なく取得されますが、[url = http://google.com] this[/url]を使用すると失敗します。
何を変更する必要がありますか?どうもありがとう。
私はこのスレッドに出くわし、正しい軌道に乗るのに役立つことがわかりましたが、JavaScript 用に 2 時間かけて構築した究極のスレッド (これは私の最初の正規表現です!) であり、クレイジーなネストや誤ってネストされた文字列に対しても非常にうまく機能することがテストされています。 、それはうまくいきます!:
string = string.replace(/\[\/?(?:b|i|u|url|quote|code|img|color|size)*?.*?\]/img, '');
string = "[b][color=blue][url=www.google.com]Google[/url][/color][/b]" の場合、新しい文字列は "Google" になります。すばらしい。
これが Google の「JavaScript RegEx strip BBCode」のトップ マッチでした。
同様の問題が発生しました。JavascriptではなくPHPで、BBCode[quote]タグとタグ内の引用符を削除する必要がありました。[quote]タグ内に任意の追加のものが含まれることが多いという問題が追加されました。[quote:7e3af94210="username"]
これは私のために働いた:
$post = preg_replace('/[\r\n]+/', "\n", $post);
$post = preg_replace('/\[\s*quote.*\][^[]*\[\s*\/quote.*\]/im', '', $post);
$post = trim($post);
1行目と3行目は、余分な改行と、正規表現の結果として残っている改行を整理するためのものです。
「]」が見つかるまで、タグの後に「]」以外の文字を許可する必要があります。
new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']');
これを次の式に簡略化できます。
\[[^]]*]([^[]*)\[\\[^]]*]
それに関する問題は、それも一致すること[WrongTag]stuff[\WrongTag]
です。ネストされたタグを一致させるには、式を複数回使用する必要があります。
BBCodeを削除するには、次のようなものを使用します。
string alltags = tags.Join("|");
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]');
グローバルに空の文字列に置き換えます。余分なループは必要ありません。
後方参照を使用して、バランスの取れたタグを確認できます。
new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]');
本当の問題は、正規表現で任意のネストされたタグを照合できないことです (これが正規言語の限界です)。一部の言語では再帰的な正規表現が許可されていますが、それらは拡張機能です (技術的には正規表現ではなくなりますが、ほとんどの人がオブジェクトに使用する名前は変更されません)。
バランスの取れたタグを気にしない場合は、見つけたタグを取り除くことができます:
new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');
おもう
new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']');
するべきです。グループ 1 の代わりに、グループ 2 を選択する必要があります。
多くの (ほとんどの?) 正規表現フレーバーでは、デフォルトで DOT メタ文字が行末記号に一致しないことを思い出してください。のようなタグを引き起こす
"[foo]dsdfs
fdsfsd[/foo]"
失敗する。正規表現に "(?s)" を追加して DOTALL を有効にするか、正規表現の DOT メタ文字を文字クラス[\S\s]に置き換えます。
これは、すべてのタグ名でうまくいきました。「[url="blablabla"][/url]」のような文字列もサポートします
str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")