所以我在JavaScript中制作一个简单的BBCode解析器,没什么太花哨的。我首先需要获得一个只匹配BBCode的正则表达式,并且只匹配标记的第一次和最后一次出现。这将有助于彼此嵌套的项目,例如
[b][c red]This should output bold red text[/c][/b]
应解析为
<span style="font-weight: bold;><span style="color: red;">This should output bold red text</span></span>
当前的“Master”正则表达式(检测字符串中是否有任何BBCode的正则表达式)如下所示。
(\[{1}([^\[]{1,3})(| .*?)\]{1}(.*?)\[{1}(\/{1}[^\]]{1,3})\]{1})
有没有办法改变这个,以便只检测第一个和最后一个匹配?
注意:我想要排除诸如[[Main Page]]
答案 0 :(得分:0)
正则表达式不适合作业,就像它不适合parsing HTML一样。这是因为它是context-free语言而不是regular语言(因此常规表达式)。
但是,我永远不会抱怨某人从事某项工作“小问题解决练习”(这就是为什么我会这样做)。你说我的评论有帮助,所以我会发布并添加解释。
\[(\w{1,3})\](.*)\[\/\1\]
<$1>$2</$1>
首先,我们查找[
,然后是1-3
“字”字符([a-zA-Z0-9_]
)的第一个捕获组,然后是]
。这个\w
可以替换为[^\]]
以匹配任何字符,但是匹配括号或您选择的其他任何字符(我不完全确定BBCode规范以及标记可以包含的内容)。然后我们(贪婪地)将0+
个字符捕获到另一个组中。最后,我们会找到一个[\
,其中包含我们的第一个捕获组(\1
引用\w{1,3}
),后跟]
。由于我们使用了(.*)
的贪婪捕获,因此它会一直持续到 last 结束标记。
现在我们有2个捕获的组,一个带有标签,另一个带有内容。您只需引用群组即可将[
更改为<
:<$1>$2</$1>