我有一个正则表达式来抓取BBcode标记。除了一个小故障外,它工作得很好。
下面是当前的表达式:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]下面是一些它成功匹配的文本和它构建的组:
Http://www.google.com]Go[url=]到谷歌 1: url 2:http://www.google.com 去谷歌吧! imghttp://www.somesite.com/someimage.jpg[/img]](http://www.somesite.com/someimage.jpg[/img]) 1: img 2:零 3:http://www.somesite.com/someimage.jpg 商第一嵌套报价/报价--第二嵌套报价/报价 1:引用 2:零 3:商数嵌套报价/引文-嵌套报价/报价
这一切都很棒。我可以通过对相同的regex运行第三个匹配组来处理嵌套的标记,并递归地处理所有嵌套的标记。问题在于使用引号标记的示例。请注意,第三个匹配组是一个由两个引号标记组成的集合,因此我们期望有两个匹配。然而,我们得到一个匹配,就像这样:
商第一嵌套报价/报价--第二嵌套报价/报价 1:引用 2:零 3:第一个嵌套报价/引文--第二个嵌套报价
啊!这不是我们想要的。有一个非常简单的方法来修复它,我从下面修改regex:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]对此:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](((?!\[/\1\]).)+)\[/\1\]通过添加((?!\[/\1\]).),如果第三个匹配组包含关闭的BBcode标记,则整个匹配无效。所以现在,我们得到了两个匹配:
商第一嵌套报价/报价-第二嵌套报价/商第一嵌套报价/报价 1:引用 2:零 3:第一个嵌套报价 套式报价/报价 1:引用 2: NULL 3:第二个嵌套引号
我很高兴把它修好了,但现在我们有了另一个问题。这个新的正则表达式在第一个引用标签上失败,我们将两个引号标记嵌套在一个更大的引号标记下。我们有两场比赛,而不是一场:
商第一嵌套报价/报价--第二嵌套报价/报价 商数嵌套报价/报价 1:引用 2:零 3:商数嵌套报价 套式报价/报价 1:引用 2:零 3:第二个嵌套报价
第一次匹配都是错误的,第二次匹配虽然格式良好,但并不是理想的匹配。我们想要一个大的匹配,第三个匹配组是两个嵌套的引号标记,就像我们使用第一个表达式时一样。
有什么建议吗?如果我能克服这个差距,我应该有一个相当强大的BBcode表达式。
发布于 2011-08-11 02:49:47
使用平衡组,您可以构造如下所示的正则表达式:
(?>
\[ (?<tag>[^][/=\s]+) \s*
(?: = \s* (?<val>[^][]*) \s*)?
]
)
(?<content>
(?>
\[(?<innertag>[^][/=\s]+)[^][]*]
|
\[/(?<-innertag>\k<innertag>)]
|
[^][]+
)*
(?(innertag)(?!))
)
\[/\k<tag>]根据Kobi的例子进行简化。
在以下方面:
[foo=bar]baz[/foo]
[b]foo[/b]
[i][i][foo=bar]baz[/foo]foo[/i][/i]
[i][i][i][i]foo[/i][/i][/i][i][i]foo[/i][/i][/i]
[quote][quote][b][img]foo[/img][b]bold[/b][b][b]deep[/b][/b][/b][/quote]bar[quote]baz[/quote][/quote]它发现这些匹配:
[foo=bar]baz[/foo][b]foo[/b][i][i][foo=bar]baz[/foo]foo[/i][/i][i][i][i][i]foo[/i][/i][/i][i][i]foo[/i][/i][/i][quote][quote][b][img]foo[/img][b]bold[/b][b][b]deep[/b][/b][/b][/quote]bar[quote]baz[/quote][/quote]http://ideone.com/uULOs的完整示例
(旧版http://ideone.com/AXzxW)
https://stackoverflow.com/questions/7018321
复制相似问题