3

私は自分のウェブサイトのBBcodeに取り組んでいます。

ほとんどのコードを完全に機能させることができましたが、[QUOTE]タグは私にいくらかの悲しみを与えています。

私がこのようなものを手に入れたら:

[QUOTE=1]
[QUOTE=2]
This is a quote from someone else
[/QUOTE]
This is someone else quoting someone else
[/QUOTE]

戻ります:

> 1 said:  [QUOTE=2]This is a quote from
> someone else

This is someone else quoting someone else[/QUOTE]

したがって、何が起こっているのかというと、ネストされた引用からの[/quote]が引用ブロックを閉じています。

私が使用している正規表現は次のとおりです。

"[quote=(.*?)\](.*?)\[/quote\]'is"

ネストされた引用符が正しく表示されるようにするにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

3

再帰的な正規表現を作成できます(変更ログに応じてlibpcre-3.0以降で使用可能):

\[quote=(.*?)\](((?R)|.)*?)\[\/quote\]

ただし、@codekaのアドバイスに従うとよいでしょう。

更新: ここでは、「正規表現全体を発生する(?R)場所に挿入する」ことを意味します。(?R)したがってa(?R)?b、(グループのキャプチャを忘れた場合)と同等a(a(?-1)?b)?ba(a(a(?-1)?b)?b)?bあり、以下同様です。代わりに、、を(?R)使用できます(?N)。これは、「N番目のキャプチャグループで置換」、「N番目の次のキャプチャグループで置換」、「N番目の前のキャプチャグループで置換」、「«aという名前のキャプチャグループで置換」を意味します。 »»。(?+N)(?-N)(?&a)

于 2010-05-26T03:23:16.367 に答える
0

これは、正規表現が適しているタスクではありません。これは、正規表現を使用してHTMLを解析しようとするようなものであり、それを実行するとどうなるかがわかります...

あなたができること、そしてそれでも私はそれがそれほど素晴らしいアイデアではないと思いますが、preg_splitを使用して入力テキストをタグと非タグに分割することです。したがって、次のようなリストになります。

  • [QUOTE = 1]
  • (空欄)
  • [QUOTE = 1]
  • これは他の誰かからの引用です
  • [/引用]
  • これは他の誰かを引用している他の誰かです
  • [/引用]

次に、タグをHTMLに変換し、プレーンテキストを変更せずに出力するリストを実行します。気を付けて「ネスト」カウントを維持することもできるので、予期しないときに「[/ quote]」が発生した場合は、無効なHTMLを出力するよりも少しうまく処理できます。または、見つけたものを出力し、後でHTMLPurifyなどでクリーンアップすることもできます。

于 2010-05-26T01:24:26.200 に答える