-1

[code] ブロックの間の < と > をすべて置き換える必要があります。[code] 内のすべてのコンテンツを選択して置換したくありません。その中の < と > を選択して、一時的に別の文字に置き換えたいだけです。他の置換を行ってから、[コード] 内の < > に戻します。

私が使用するソリューション:

replace(/<(?=[^\[]*\[\/code\])/gi,"&_lt_;"); 
replace(/>(?=[^\[]*\[\/code\])/gi,"&_gt_;"); 

DO OTHER REPLACEMENT/CUSTOMIZATION HERE 

replace(/&_lt_;/gi,"<"); 
replace(/&_gt_;/gi,">"); 

唯一の問題は、[コード] の間のコンテンツに文字 [ が含まれている場合、ブロック内のその文字の前では機能しないことです。どうすればこれを修正できますか?

動作する例:

<b>
[code]
<form action="nd.php" method="post">
<b>
<strong>
[/code]
<b>

動作しない例:

<b>
[code]
<form action="nd.php" method="post">
<b>
$_POST[
<strong>
[/code]
<b>

編集:単純な正規表現置換ソリューションのみを提供してください。この問題に対してコールバック関数を使用できません。

4

2 に答える 2

1

リンクされた質問に対する受け入れられた回答は、「機能する例」では機能しません。ただし、他の答えはそうです-「機能しない例」でも機能します(ただし、タイプミスがありました)。

次の正規表現を試してください。

/(\[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]大文字を処理する必要があります)。

于 2012-10-04T12:45:39.930 に答える
1

これが私の編集された答えです。またすみません。

str = str.replace(/(\[code\])(.*?)(\[\/code\])/gm,function(a,b,c,d) {
    return b + c.replace(/</g,'&lt;').replace(/>/g,'&gt;') + d;
});
于 2012-10-04T13:41:16.883 に答える