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 式が必要です。