我需要一个正则表达式来去除字符串中的任何 BBCode。我有以下(和一个带有标签的数组):
new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');
它可以很好地获取 [tag]this[/tag] ,但是在使用 [url= http://google.com]this[/url]时失败。
我需要改变什么?非常感谢。
我需要一个正则表达式来去除字符串中的任何 BBCode。我有以下(和一个带有标签的数组):
new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']');
它可以很好地获取 [tag]this[/tag] ,但是在使用 [url= http://google.com]this[/url]时失败。
我需要改变什么?非常感谢。
我遇到了这个线程,发现它有助于让我走上正确的轨道,但这是我花了两个小时为 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”的最佳匹配;)
您可以使用反向引用检查平衡标签:
new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]');
真正的问题是你不能匹配正则表达式中的任意嵌套标签(这是正则语言的限制)。有些语言确实允许递归正则表达式,但这些是扩展(从技术上讲,它们是非正则的,但不会改变大多数人用于对象的名称)。
如果你不关心平衡标签,你可以去掉你找到的任何标签:
new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]');
我有一个类似的问题——在 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 行只是为了整理任何额外的换行符,以及由于正则表达式而留下的任何换行符。
您必须允许在标记后使用除 ']' 以外的任何字符,直到找到 ']'。
new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']');
您可以将其简化为以下表达式。
\[[^]]*]([^[]*)\[\\[^]]*]
问题是,它也会匹配[WrongTag]stuff[\WrongTag]
。匹配嵌套标签需要多次使用表达式。
要删除任何BBCode,请使用以下内容:
string alltags = tags.Join("|");
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]');
用空字符串全局替换。不需要额外的循环。
这对我有用,适用于每个标签名称。它还支持像 '[url="blablabla"][/url]' 这样的字符串
str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*( *[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")
我认为
new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']');
应该这样做。然后,您必须选择第 2 组,而不是第 1 组。
请记住,默认情况下,许多(大多数?)正则表达式风格不会让 DOT 元字符匹配行终止符。导致像这样的标签
"[foo]dsdfs
fdsfsd[/foo]"
失败。通过在正则表达式中添加 "(?s)" 来启用 DOTALL,或者将正则表达式中的 DOT 元字符替换为字符类[\S\s]。