-1

我需要替换 [code] 块之间的所有 < 和 >。我不想选择和替换 [code] 中的所有内容,我只想在其中选择 < 和 >,然后将其临时替换为另一个字符。进行其他替换,然后将它们返回到 [code] 中的 < >。

我使用的解决方案:

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

DO OTHER REPLACEMENT/CUSTOMIZATION HERE 

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

唯一的问题是,如果 [code] 之间的内容包含字符 [ 它在块中的该字符之前不起作用。我怎样才能解决这个问题?

有效的例子:

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

一个正则表达式修改是在 html-tag 部分(正则表达式的第二部分)周围添加一个组。这将允许它被传递给回调函数。

更新[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 回答