BBCode的JavaScript RegExp帮助

时间:2011-09-22 19:40:11

标签: javascript regex

我有几个星期前发现的这个RegExp表达式

/([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F"'\(\)<>\[\]]{1,256}))?\])|(?:\[\/([a-z]{1,16})\])/ig

它正在努力寻找BBC代码标签,例如[url][code]

但是,如果我尝试[url="http://www.google.com"]则不匹配。我不是很擅长RegExp而且我无法弄清楚如何仍然有效,但="http://www.google.com"是可选的。

这对于[color="red"]也是失败的,但是这与url标签有同样的问题。

2 个答案:

答案 0 :(得分:1)

这一部分:[^\x00-\x1F"'\(\)<>\[\]]表示在=之后一定不能有“。这意味着你的正则表达式匹配[url=http://stackoverflow.com]。如果你想有引号,你可以简单地把它们放在一边你的捕获小组:

/([\r\n])|(?:\[([a-z\*]{1,16})(?:="([^\x00-\x1F"'\(\)<>\[\]]{1,256})")?\])|(?:\[\/([a-z]{1,16})\])/gi

答案 1 :(得分:1)

我认为您可以从显式枚举您想要匹配的所有标记中受益,因为它应该允许更具体地匹配结束标记。

这是sample code

var tags = [ 'url', 'code', 'b' ]; // add more tags

var regParts = tags.map(function (tag) {
    return '(\\[' + tag + '(?:="[^"]*")?\\](?=.*?\\[\\/' + tag + '\\]))';
});

var re = new RegExp(regParts.join('|'), 'g');

您可能会注意到正则表达式由一组较小的表达式组成,每个较小的一个表示具有可变长度的可能属性((?:="[^"]*")?,见下面的解释)的单个标记,如[url="google.com"],并用交替运算符|分隔。

(="[^"]*")?表示=符号,然后是双引号,后跟任何数量的双引号([^"])以外的任何符号,即0或更多,({{1} }),然后是结束报价。最终*意味着整个群体可能根本不存在。