リンクされた質問に対する受け入れられた回答は、「機能する例」では機能しません。ただし、他の答えはそうです-「機能しない例」でも機能します(ただし、タイプミスがありました)。
次の正規表現を試してください。
/(\[code\][\s\S]*?\[\/code\])|<[\s\S]*?>/g
関数ではreplace()
、次を使用します。
.replace(/(\[code\][\s\S]*?\[\/code\])|<[\s\S]*?>/g, '$1');
編集
私が正しく理解している場合、あなたの最終目標はすべてのコンテンツを同じ内に保つことですが、これらのタグの外側[code][/code]
にあるすべての HTML タグを置換できるようにすることです(文字を完全に削除することを意味する場合としない場合があります)。 ?
この場合、正規表現の長いリストは必要ありません。上記の正規表現は (少し変更して) 使用でき、多くのケースをカバーできます。正規表現/置換をコールバック関数と組み合わせて、追加の置換を処理します。
var replaceCallback = function(match) {
// if the match's first characters are '[code]', we have a '[code][/code]' block
if (match.substring(0, 6) == '[code]') {
// do any special replacements on this block; by default, return it untouched
return match;
}
// the match you now have is an HTML tag; it can be `<tag>` or `</tag>`
// do any special replacements; by default, return an empty string
return '';
}
str = str.replace(/(\[code\][\s\S]*?\[\/code\])|(<[\s\S]*?>)/g, replaceCallback);
1 つの正規表現の変更は、html-tag セクション (正規表現の 2 番目の部分) の周りにグループを追加することでした。これにより、コールバック関数に渡すことができます。
更新([code]
リテラルではありません)
コメントによると、タグ[code]
がリテラルではないことに気付きました。すべての BBCode スタイルのタグをカバーする必要があります。これは上記の例と同じくらい簡単です (コールバックではさらに簡単です)。正規表現の単語の代わりに、すべてのアルファベット文字をカバーするためにcode
使用できます。[a-z]+
次に、コールバック内で最初の文字を確認できます。の場合[
は、コード ブロック内にいます。それ以外の場合は、コード ブロックの外側に HTML タグがあります。
var replaceCallback = function(match) {
// if the match's first character is '[', we have a '[code][/code]' block
if (match.substring(0, 1) == '[') {
// do any special replacements on this block; by default, return it untouched
return match;
}
// the match you now have is an HTML tag; it can be `<tag>` or `</tag>`
// do any special replacements; by default, return an empty string
return '';
}
str = str.replace(/(\[[a-z]+\][\s\S]*?\[\/[a-z]+\])|(<[\s\S]*?>)/gi, replaceCallback);
また、大文字と小文字を区別しないように正規表現のオプションに追加したことにも注意してくださいi
(そうしないと、[a-zA-Z]
大文字を処理する必要があります)。