对于“有效的示例”,链接问题的接受答案对我不起作用。但是,另一个答案确实如此- 它也适用于“不起作用的示例”(虽然有一个错字)。
尝试以下正则表达式:
/(\[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]
处理大写字母)。