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