1

我需要一个正则表达式来去除字符串中的任何 BBCode。我有以下(和一个带有标签的数组):

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

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

我需要改变什么?非常感谢。

4

8 回答 8

3

我遇到了这个线程,发现它有助于让我走上正确的轨道,但这是我花了两个小时为 JavaScript 构建的终极线程(这是我的第一个 RegEx!),并且经过测试可以很好地处理疯狂的嵌套甚至错误嵌套的字符串,它只是工作!:

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

如果 string = "[b][color=blue][url=www.google.com]Google[/url][/color][/b]" 那么新字符串将是“Google”。惊人。

希望有人觉得这很有用,这是 Google 中“JavaScript RegEx strip BBCode”的最佳匹配;)

于 2009-09-27T14:47:12.147 回答
1

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

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

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

如果你不关心平衡标签,你可以去掉你找到的任何标签:

 new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');
于 2009-05-11T13:44:34.187 回答
1

我有一个类似的问题——在 PHP 而不是 Javascript 中——我不得不去掉 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 行只是为了整理任何额外的换行符,以及由于正则表达式而留下的任何换行符。

于 2012-07-25T15:26:47.740 回答
1

您必须允许在标记后使用除 ']' 以外的任何字符,直到找到 ']'。

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

您可以将其简化为以下表达式。

\[[^]]*]([^[]*)\[\\[^]]*]

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

于 2009-05-11T12:59:28.583 回答
1

要删除任何BBCode,请使用以下内容:

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

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

于 2009-05-11T13:01:07.190 回答
0

这对我有用,适用于每个标签名称。它还支持像 '[url="blablabla"][/url]' 这样的字符串

str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")
于 2013-03-04T13:41:50.063 回答
0

我认为

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

应该这样做。然后,您必须选择第 2 组,而不是第 1 组。

于 2009-05-11T12:59:38.410 回答
0

请记住,默认情况下,许多(大多数?)正则表达式风格不会让 DOT 元字符匹配行终止符。导致像这样的标签

"[foo]dsdfs
fdsfsd[/foo]"

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

于 2009-09-27T14:51:45.677 回答