首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复BBcode正则表达式

如何修复BBcode正则表达式
EN

Stack Overflow用户
提问于 2011-08-10 21:52:41
回答 1查看 388关注 0票数 3

我有一个正则表达式来抓取BBcode标记。除了一个小故障外,它工作得很好。

下面是当前的表达式:

代码语言:javascript
复制
\[([^=\[\]]+)[=\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:

代码语言:javascript
复制
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]

对此:

代码语言:javascript
复制
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](((?!\[/\1\]).)+)\[/\1\]

通过添加((?!\[/\1\]).),如果第三个匹配组包含关闭的BBcode标记,则整个匹配无效。所以现在,我们得到了两个匹配:

商第一嵌套报价/报价-第二嵌套报价/商第一嵌套报价/报价 1:引用 2:零 3:第一个嵌套报价 套式报价/报价 1:引用 2: NULL 3:第二个嵌套引号

我很高兴把它修好了,但现在我们有了另一个问题。这个新的正则表达式在第一个引用标签上失败,我们将两个引号标记嵌套在一个更大的引号标记下。我们有两场比赛,而不是一场:

商第一嵌套报价/报价--第二嵌套报价/报价 商数嵌套报价/报价 1:引用 2:零 3:商数嵌套报价 套式报价/报价 1:引用 2:零 3:第二个嵌套报价

第一次匹配都是错误的,第二次匹配虽然格式良好,但并不是理想的匹配。我们想要一个大的匹配,第三个匹配组是两个嵌套的引号标记,就像我们使用第一个表达式时一样。

有什么建议吗?如果我能克服这个差距,我应该有一个相当强大的BBcode表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-11 02:49:47

使用平衡组,您可以构造如下所示的正则表达式:

代码语言:javascript
复制
(?>
  \[ (?<tag>[^][/=\s]+) \s*
  (?: = \s* (?<val>[^][]*) \s*)?
  ]
)

(?<content>
  (?>
    \[(?<innertag>[^][/=\s]+)[^][]*]
    |
    \[/(?<-innertag>\k<innertag>)]
    |
    [^][]+
  )*
  (?(innertag)(?!))
)

\[/\k<tag>]

根据Kobi的例子进行简化。

在以下方面:

代码语言:javascript
复制
[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)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7018321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档