正则表达式:去除 BBCode 标记

3

我需要一个正则表达式来删除字符串中的任何BBCode。 我已经有以下内容(以及一个标签数组):

new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');

它可以很好地识别[tag]this[/tag],但在使用[url=http://google.com]this[/url]时失败。

我需要做出哪些改变?非常感谢。


жүҖд»ҘдҪ жӣҙеёҢжңӣеҲ йҷӨеңЁtagsж•°з»„дёӯз»ҷеҮәзҡ„д»»дҪ•ж ҮзӯҫгҖӮ - Gumbo
8个回答

7

我看到了这个帖子,发现它对我找到正确方向很有帮助。但是,以下是我花费两个小时编写的JavaScript正则表达式,经过测试可以非常好地处理复杂嵌套和错误嵌套的字符串,它完美运行!

string = string.replace(/\[\/?(?:b|i|u|url|quote|code|img|color|size)*?.*?\]/img, '');

如果字符串为"[b][color=blue][url=www.google.com]Google[/url][/color][/b]",那么新字符串将是"Google"。太棒了。
希望有人会觉得这个有用,在谷歌上搜索“JavaScript RegEx strip BBCode”时,这是一个最佳匹配;)

谢谢 - 这是页面上唯一对我有效的解决方案。 - Neuralrank

1

在标签后,你必须允许任何字符出现,直到找到“]”为止。

new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']');

你可以将其简化为以下表达式。
\[[^]]*]([^[]*)\[\\[^]]*]

问题在于,它也会匹配[WrongTag]stuff[\WrongTag]。匹配嵌套标签需要多次使用表达式。

当你的目标是去除任何BBcode标签时,为什么你应该对标签嵌套感兴趣呢? - Tomalak
[^]] 需要转义为 [^\]] - Question Mark

1

要去除任何BBCode,可以使用类似以下的代码:

string alltags = tags.Join("|");
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]');

将全局替换为空字符串。不需要额外的循环。

[^\]]不匹配除了']'之外的字符,但是匹配除了''后面跟着']'的字符,因为在第一个位置不能转义']'。正确的写法是[^]]。 - Daniel Brückner
在字符类中没有"followed by"这个概念。如果有的话,字符类将匹配除了 "" 和 "]" 之外的所有内容。我会去掉多余的反斜杠。 - Tomalak

1

你可以使用反向引用来检查平衡标签:

 new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]');

真正的问题在于你无法在正则表达式中匹配任意嵌套标签(这是正则语言的限制)。一些语言确实允许使用递归正则表达式,但这些都是扩展(从技术上讲,它们不再是正则的,但并不改变大多数人对对象的称呼)。

如果您不关心平衡标签,可以直接删除找到的任何标签:

 new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');

平衡标签在这里完全无关紧要。楼主希望删除标签,而不是匹配它们。 - Tomalak

1
我曾经遇到过类似的问题 - 不是在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行只是为了整理任何额外的换行符,以及由正则表达式留下的任何换行符。


0

我认为

new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']');

应该这样做。不要选择第一组,而是选择第二组。

[^\]]不匹配除']'以外的字符,但是匹配除''后跟着']'之外的字符,因为在第一个位置不能转义']'。正确的写法是[^]]。 - Daniel Brückner

0
这对我来说很有效,适用于每个标签名称。它还支持像 '[url="blablabla"][/url]' 这样的字符串。
str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")

0
记住,许多(大多数?)正则表达式引擎默认情况下不允许点元字符匹配行终止符。这会导致像

这样的标签无法匹配。
"[foo]dsdfs
fdsfsd[/foo]"

失败。要么通过在正则表达式中添加"(?s)"来启用DOTALL,要么将正则表达式中的DOT元字符替换为字符类[\S\s]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接