BBCodeからHTMLへのコンバーター

BBCodeはフォーラム時代の軽量マークアップでした。[b]bold[/b][url][quote][code]のような形式です。phpBB、vBulletin、XenForo、SMFのほぼすべての掲示板で使われ、それらのプラットフォームには今も何百万件もの投稿が残っています。このコンバーターはBBCodeを解析し、現代的なCMS、静的サイト、フォーラムタグを理解しないMarkdown-to-HTMLパイプラインへ貼り付けられる、妥当できれいなHTMLを出力します。

BBCodeを変換する方法

  1. 1

    BBCodeを貼り付ける

    投稿全体でも断片でも構いません。入れ子のタグも処理します。

  2. 2

    パーサーが開始タグと終了タグをトークン化

    対応する `[tag]...[/tag]` の組から、対応するHTML要素を生成します。

  3. 3

    タグ属性を対応付ける

    `[color=red]`、`[size=18]`、`[url=https://...]` のような指定はインラインスタイルや`href`属性になります。

  4. 4

    HTMLをコピー

    ブログ記事、ドキュメントページ、フォーラム移行にそのまま使えます。

対応タグ

BBCode HTML出力
[b]text[/b] <strong>text</strong>
[i]text[/i] <em>text</em>
[u]text[/u] <u>text</u> or <ins>
[s]text[/s] <del>text</del>
[url]link[/url] <a href="link">link</a>
[url=link]text[/url] <a href="link">text</a>
[img]link[/img] <img src="link">
[quote]q[/quote] <blockquote>q</blockquote>
[code]c[/code] <pre><code>c</code></pre>
[list][*]a[*]b[/list] <ul><li>a</li><li>b</li></ul>
[list=1][*]a[/list] <ol><li>a</li></ol>
[color=red]t[/color] <span style="color:red">t</span>
[size=18]t[/size] <span style="font-size:18px">t</span>
[table]...[/table] <table>...</table>

セキュリティ上の注意

BBCodeは設計上安全ですが、HTMLはそうではありません。ユーザー投稿のBBCodeをHTMLへ変換する瞬間は、2005年ごろのフォーラムがXSSを持ち込んだ典型的な場面でした。変換後の出力を公開する場合は、次を守ってください。

  • BBCodeタグ内の生のテキストは必ずエスケープする。
  • コンバーターが出力するタグをホワイトリスト化する。未知のタグを生のHTMLとして流さない。
  • [url][img] のURLを検証し、javascript:data: スキームをブロックする。

このツールは変換時に、スクリプトのように振る舞うURLを削除または無害化します。

フォーラム全体の移行

数千件の投稿を移す場合は、コンバーターをパイプラインとして使います。投稿をBBCodeとして書き出す → このコンバーターへ通す → HTMLを取り込む、という流れです。標準タグセットにない特殊な入れ子や独自の絵文字コードを含む投稿を、数十件ほど抜き取りで確認してください。

BBCodeがきれいに対応しないもの

  • 独自のフォーラム用顔文字:D:)) — そのまま残してCSSで描画するか、別途前処理します。
  • プラグイン固有のタグ[spoiler][youtube]など) — カスタムタグのパネルに載っていれば処理します。そうでなければそのままの文字列として出力します。
  • 結合または未閉じのタグ — パーサーは自動で閉じようとしますが、極端に壊れた入力では書式が失われることがあります。

よくある質問

はい。Steamコミュニティの投稿、vBulletinやXenForoの掲示板、一部のwiki、多くの古いphpBB環境で使われています。いくつかのゲームサーバー管理パネルでは、内部マークアップとしても残っています。

このツールではできません。HTMLからBBCodeへの変換ツールを使ってください。逆方向はHTMLの表現力がBBCodeよりずっと高いため、情報が失われやすくなります。

標準では未知のタグはそのままの文字列として通します。完全にきれいな出力を保証したい場合は、厳格(strict)モードで丸ごと削除できます。

はい。[quote][list][code] は任意の深さで入れ子にできます。パーサーがタグのスタックを追跡し、正しく閉じます。

関連ツール