3

BBcode タグを取得する正規表現があります。軽微な不具合を除けば、問題なく動作します。

現在の式は次のとおりです。

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

正常に照合されたテキストと、作成されたグループは次のとおりです。

[url= http://www.google.com] Google へ [/url]
1: URL
2: http://www.google.com
3: Google へ

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

[引用][引用]最初のネストされた引用[/引用][引用]2 番目のネストされた引用[/引用][/引用]
1: 引用
2: NULL
3: [引用]最初のネストされた引用[/引用][引用]2 番目のネストされた引用引用[/引用]

これはすべて素晴らしいことです。同じ正規表現に対して 3 番目の一致グループを実行し、ネストされたすべてのタグを再帰的に処理することで、ネストされたタグを処理できます。問題は、[quote] タグを使用した例にあります。3 番目の一致グループは 2 つの引用タグのセットであるため、2 つの一致が予想されることに注意してください。ただし、次のように 1 つの一致が得られます。

[引用]最初のネストされた引用[/引用][引用]2 番目のネストされた引用[/引用]
1: 引用
2: NULL
3: 最初のネストされた引用[/引用][引用]2 番目のネストされた引用

ああ!それは私たちが望んでいたことではありません。それを修正するかなり簡単な方法があります。私はこれから正規表現を変更します:

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

これに:

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

追加すること((?!\[/\1\]).)で、3 番目の一致グループに終了 BBcode タグが含まれている場合、一致全体を無効にします。これが機能するようになり、2 つの一致が得られます。

[引用]最初のネストされた引用[/引用][引用]2番目のネストされた引用[/引用]

[引用]最初のネストされた引用[/引用]
1: 引用
2: NULL
3: 最初のネストされた引用

[引用]2 番目のネストされた引用[/引用]
1: 引用
2: NULL 3: 2 番目のネストされた引用

修正できてよかったのですが、別の問題が発生しました。この新しい正規表現は、1 つの大きな引用タグの下に 2 つの引用タグをネストした最初の正規表現では失敗します。1 つではなく 2 つの一致が得られます。

[引用][引用]最初のネストされた引用[/引用][引用]2番目のネストされた引用[/引用][/引用]

[引用][引用]最初のネストされた引用[/引用]
1: 引用
2: NULL
3: [引用]最初のネストされた引用

[引用]2 番目のネストされた引用[/引用]
1: 引用
2: NULL
3: 2 番目のネストされた引用

最初の一致はすべて間違っており、2 番目の一致は整形式ではありますが、望ましい一致ではありません。最初の式を使用したときのように、3 番目の一致グループが 2 つのネストされた引用タグである 1 つの大きな一致が必要でした。

助言がありますか?このギャップを越えることができれば、かなり強力な BBcode 式が必要です。

4

1 に答える 1

4

バランシング グループを使用すると、次のような正規表現を作成できます。

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

于 2011-08-11T02:49:47.523 に答える