0

バックグラウンド

C#BBCode を HTML に変換する非常に単純な BBCode パーサーを作成しました。現在、、、およびタグのみをサポートして[b][i]ます[u]。ユーザーが入力したものに関係なく、BBCode は常に有効であると見なされることを私は知っています。BBCode を HTML に変換する厳密な仕様が見つかりません

質問

  1. 標準の「BBCode to HTML」仕様は存在しますか?
  2. どのように処理すればよい"[b][b][/b][/b]"ですか? 今のところ、パーサーは を生成し"<b>[b][/b]</b>"ます。
  3. 入力をどのように処理すればよい"[b][i][u]zzz[/b][/i][/u]"ですか? 現在、私のパーサーは"<b><i><u>zzz</u></i></b>"そのような場合に出力を生成するのに十分スマートですが、それは「スマートすぎる」アプローチなのだろうか、それともそうではないのでしょうか?

詳細

すぐに使用できる BBCode パーサーの実装をいくつか見つけましたが、それらは私には重すぎて複雑すぎます。さらに悪いことに、大量の正規表現を使用し、期待どおりのマークアップを生成しません。理想的には、出力で XHTML を受け取りたいと考えています。「BBCode から HTML へ」の変換規則を推測するために、私はこのオンライン パーサーを使用しています: http://www.bbcode.org/playground.php。私の意見では直感的に正しい HTML を生成します。私が気に入らないのは、XHTML を生成しないことだけです。たとえば、 (終了タグの順序に注意)"[b][i]zzz[/b][/i]"に変換されます。"<b><i>zzz</b></i>"もちろん、FireBug はこれを として表示し"<b><i>zzz</i></b><i></i>"ます。私が理解しているように、ブラウザはそのような間違った終了タグの順序のケースを修正しますが、私は疑問があります:

  1. このブラウザの機能に頼って、XHTML を作成しようとしないでください。
  2. おそらく次の"[b][i]zzz[/b]ccc[/i]"ように理解する必要があります"<b>[i]zzz</b>ccc[/i]"- そのような不適切な書式設定を論理的に見ますが、一般的なフォーラム BBCode の出力 ( *zzz****ccc* ではなく **[i]zzzccc[/i] )と競合しています。

ありがとう。

4

3 に答える 3

2

あなたの最初の質問についてですが、プロジェクトの範囲に関係なく、あらゆる種類の間違いを修正するためにブラウザーに依存することは良い考えではないと思います (まあ、実際にブラウザー自体でバグ テストを行っている場合を除いて)。一部のブラウザはそれで素晴らしい仕事をするかもしれませんが、他のブラウザは惨めに失敗するかもしれません. 出力構文が正しい (または少なくとも可能な限り正しい) ことを確認する最善の方法は、最初に正しい構文でブラウザーに送信することです。

2 番目の質問については、正しい BBCode を正しい HTML に変換しようとしているため、入力が[b][i]zzz[/b]ccc[/i]の場合、正しいHTML に相当するものは<i><b>zzz</b>ccc</i>and notになり<b>[i]zzz</b>ccc[/i]ます。そして、これはもはや単なるコンバーターではなく、構文チェッカー/修正プログラムも作成するため、物事が複雑になるところです。かなり奇妙なゲームエンジンスクリプト言語用にPHPで同様のスクリプトを作成しましたが、ロジックはあなたのケースに簡単に適用できます. 基本的に、開始タグごとにフラグを設定し、終了タグが正しい位置にあるかどうかを確認しました。もちろん、これにより機能が制限されますが、私が必要としていたことはうまくいきました。より高度な検索パターンが必要な場合は、正規表現にこだわっていると思います。

于 2009-12-13T22:38:01.067 に答える
0

それほど重要ではない B、I、および U のみを実装する場合は、これらのタグのそれぞれにカウンターを用意するだけではどうですか。開くたびに +1 し、閉じるたびに -1 します。

フォーラムの投稿 (または何でも) の最後で、まだ開いているタグがある場合は、単にそれらを閉じます。ユーザーが無効な bbcode を入力すると、投稿の間は奇妙に見えるかもしれませんが、悲惨なことにはなりません。

于 2009-12-14T03:19:30.220 に答える