本文介绍了帮助修复了BB code定期EX pression的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个正规的前pression,抓住BB code标签。它的伟大工程,除了一个小故障。

I have a regular expression that grabs bbcode tags. It works great except for a minor glitch.

下面是目前的前pression:

Here is the current expression:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]

下面是一些文本它成功匹配的反对,它建立了组:

Here is some text it successfully matches against and the groups it builds:

![URL = HTTP://www.google.com]去Google [/ URL]
  1:URL
  2: http://www.google.com
  3:去谷歌

[IMG] http://www.somesite.com/someimage.jpg [/ IMG]
  1:IMG
  2:NULL
  3: http://www.somesite.com/someimage.jpg

[img]http://www.somesite.com/someimage.jpg[/img]
1: img
2: NULL
3: http://www.somesite.com/someimage.jpg

[报价] [报价]第一嵌套报价[/报价] [报价]第二个嵌套报价[/报价] [/报价]
  1:报价
  2:NULL
  3:[报价]第一嵌套报价[/报价] [报价]第二个嵌套报价[/报价]

[quote][quote]first nested quote[/quote][quote]second nested quote[/quote][/quote]
1: quote
2: NULL
3: [quote]first nested quote[/quote][quote]second nested quote[/quote]

这一切是伟大的。我可以处理嵌套的标签,通过运行第三节比赛组对同一正则表达式和递归处理该嵌套的所有标签。问题是与使用[报价]标签的例子。请注意,第三节比赛组是一组两个引号标记,因此我们认为,两场比赛。然而,我们得到一个匹配,像这样的:

All of this is great. I can handle nested tags by running the 3rd match group against the same regex and recursively handle all tags that are nested. The problem is with the example using the [quote] tags. Notice that the 3rd match group is a set of two quote tags, so we would expect two matches. However, we get one match, like this:

[报价]第一嵌套报价[/报价] [报价]第二个嵌套报价[/报价]
  1:报价
  2:NULL
  3:第一个嵌套的报价[/报价] [报价]第二个嵌套报价

哈啊!这不是我们想要的。有一个修复它相当简单的方式,我修改正则表达式从这样的:

Ahhhh! That's not what we wanted at all. There is a fairly simple way to fix it, I modify the regex from this:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]

要这样:

\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](((?!\[/\1\]).)+)\[/\1\]

加入((?!\ [/ \ 1 \])。)我们在整场比赛无效,如果第三个比赛组包含收盘BB code标签。所以,现在这个工程中,我们得到两个匹配:

By adding ((?!\[/\1\]).) we invalidate the entire match if the 3rd match group contains the closing BBcode tag. So now this works, we get two matches:

[报价]第一嵌套报价[/报价] [报价]第二个嵌套报价[/报价]

[报价]第一嵌套报价[/报价]
  1:报价
  2:NULL
  3:第一个嵌套报价

[quote]first nested quote[/quote]
1: quote
2: NULL
3: first nested quote

[报价]第二个嵌套报价[/报价]
  1:报价
  2:NULL  3:第二个嵌套报价

[quote]second nested quote[/quote]
1: quote
2: NULL 3: second nested quote

我感到高兴的是固定的,但现在我们有一个问题。在第一个这种新的正则表达式失败的地方在一个大的报价标签,我们窝在两个引号标记。我们得到了两场比赛,而不是一个:

I was happy that fixed it, but now we have another problem. This new regex fails on the first one where we nest the two quote tags under one larger quote tag. We get two matches instead of one:

[报价] [报价]第一嵌套报价[/报价] [报价]第二个嵌套报价[/报价] [/报价]

[报价] [报价]第一嵌套报价[/报价]
  1:报价
  2:NULL
  3:[报价]第一嵌套报价

[quote][quote]first nested quote[/quote]
1: quote
2: NULL
3: [quote]first nested quote

[报价]第二个嵌套报价[/报价]
  1:报价
  2:NULL
  3:第二个嵌套报价

[quote]second nested quote[/quote]
1: quote
2: NULL
3: second nested quote

第一场比赛都是错误的,第二场比赛,而良好的,是不是想要的比赛。我们需要一个大的比赛的第三节比赛一组为两个嵌套引号标记,如当我们用第一八佰伴pression。

The first match is all wrong and the second match, while well-formed, is not a desired match. We wanted one big match with the 3rd match group being the two nested quote tags, like when we used the first expression.

有什么建议?我觉得像我这么近。如果我可以跨越这个差距我应该有一个相当强大的BB code EX pression。

Any suggestions? I feel like I'm so close. If I can just cross this gap I should have a fairly powerful BBcode expression.

任何帮助是AP preciated。

Any help is appreciated.

推荐答案

使用的你可以构建这样的正则表达式:

Using balancing groups you can construct a regex like this:

(?>
  \[ (?<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]

据发现这些比赛:

It finds these matches:

  • [富=栏]巴兹[/富]
  • [B]富[/ B]
  • [I] [I] [富=栏]巴兹[/富]富[/ I] [/ I]
  • [我] [我] [我] [我]富[/ I] [/ I] [/ I] [I] [I]富[/ I] [/ I] [ / I]
  • <$c$c>[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

这篇关于帮助修复了BB code定期EX pression的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 11:46