HTML からバックエンド言語の出力コードへ
Web処理はすべてブラウザ内で完結します。データは送信されません
HTML の断片を ASP・VB.NET・JSP・PHP・Perl の出力ステートメントに変換します。手作業で厄介なのは引用符よりも、それぞれ気づきにくい落とし穴のほうです。VB 系は引用符を 2 つ重ね、C 系はバックスラッシュで逃がす —— 間違えると画面が真っ白になります。PHP の二重引用符の中ではドル記号が展開されるため、価格を含む HTML が一部欠けたまま出力されます。そして JSP の文字列中の `%>` や PHP の `?>` はスクリプトブロックを途中で閉じてしまい、それ以降の HTML がそのままページ本文として表示されます —— JavaScript に HTML を埋め込むときの `</script>` と同じ事故です。ここではすべて言語ごとの規則で処理し、表現できない部分は生成コードのコメントに明記します。
機能
- 5 つの出力先:ASP(VBScript)、ASP.NET(VB.NET)、JSP、PHP、Perl
- 引用符は各言語の流儀でエスケープ:VB 系は 2 つ重ね、PHP・Perl・JSP はバックスラッシュ
- PHP と Perl のドル記号、Perl の @ をエスケープし、変数展開されないようにする
- 文字列中の %> は %\>、PHP の ?> は \x3f> と書き、スクリプトブロックが途中で閉じないようにする
- 1 行につき 1 ステートメントを生成し、改行をそのまま保つ(HTML が 1 行に潰れない)
- 改行は常に \n を使い、println のようなプラットフォーム依存の書き方はしない
- CRLF と LF のどちらも受け取り、出力は LF に統一
- 空行と末尾の改行を忠実に扱う(余分なステートメントも、欠けも出さない)
- コメントは英語 —— .jsp や .php のファイルに入るため
- 出力はシンタックスハイライト付きで、まとめてコピーできる
使い方
- 出力したい HTML を貼り付ける
- 出力先の言語を選ぶ
- 内容に終了タグが含まれないと確信できる場合のみ、終了タグの分断をオフにする
- 生成されたステートメントをテンプレートファイルに貼る
よくある質問
- なぜ 1 行ずつ出力するのですか?まとめて 1 つの文字列ではだめですか?
- テンプレートにそのまま貼れて、行単位で追えるのがこの形だからです。まとめたほうが短くはありますが、各言語の複数行文字列の仕組み(PHP と Perl のヒアドキュメント、VB の文字列連結)が必要で、5 言語で書き方が異なります。さらにエスケープが 1 箇所でも崩れると、長い塊の中から該当行を探すことになります。1 行 1 ステートメントなら、壊れた行がそのままその行です。
- 各行の後ろに & vbLf や \n が付くのはなぜですか?
- これらの出力文は自分では改行を足さないからです。Response.Write も echo も out.print も、渡した文字列をそのまま書きます。足さないと HTML 全体が 1 行に潰れます —— ほとんどのタグでは無害ですが、`<pre>` や `<textarea>` の中の改行は内容そのものなので、失うと破損になります。入力の最終行に改行が無ければ、ここでも足しません。
- PHP と Perl のドル記号がエスケープされるのはなぜですか?
- この 2 言語の二重引用符文字列は展開するからです。PHP は `"$name"` を変数として展開し、Perl は `$name` と `@name` の両方を展開します。プレースホルダーや価格を含む HTML(`<b>$99</b>`、`mailto:me@example.com`)をそのまま入れると、内容が一部欠けるか、実行時に未定義変数の警告が出ます —— どちらも「データがそもそも空だった」ように見える失敗です。JSP のドル記号に特別な意味は無いので、そのままにします。
- 「スクリプト終了タグの分断」とは何ですか?
- JSP と ASP のコードは `<% ... %>` の中に、PHP は `<?php ... ?>` の中に書きますが、テンプレートのパーサーは文字列の中かどうかを見ずに、ソース上のその 2 文字を探します。したがって `echo "<div>?>";` のような行はそこで PHP モードを抜け、以降はページ本文として表示されます —— エラーも白画面も出ず、妙な文字列がページに現れるだけです。このオプションを有効にすると、`%>` は `%\>`(これらのパーサーが解釈するエスケープ)に、PHP の `?>` は `\x3f>`(16 進エスケープ)になり、値は変わらないままソースからその並びが消えます。
- 生成された PHP に終了タグが無いのはなぜですか?
- PHP の公式マニュアルは、ファイル全体が PHP である場合に末尾の `?>` を省くことを推奨しています。その後ろに改行や空白があると、それ自体がブラウザへ送信され、レスポンスの先頭に余計な空白が生まれます —— これが原因の「headers already sent」は有名な難物です。ASP と JSP の `%>` は必須なのでそのまま残します。
- 入力した HTML は送信されますか?
- いいえ。変換はすべてブラウザのメモリ上で完結し、ページは一切リクエストを送りません。オフラインでも動作します。
関連ツール
HTML ↔ JS
WebHTML を JS の文字列リテラルへエスケープ(`</script>` の分断、引用符・改行の処理つき)。逆に、エスケープされた文字列を HTML に戻すこともできます。
リダイレクトコード生成
WebApache・Nginx・PHP・ASP・JSP など十一種類のリダイレクトコードを生成。301 / 302 / 307 / 308 を選べ、すべてブラウザ内で処理します。
HTML 実体参照
エンコード< > & と引用符を HTML 実体参照に変換し、文字へ戻します。デコードは1回だけで、&lt; は山括弧ではなく < になります。すべてブラウザ内で処理します。
HTML 整形
整形HTML をオンラインで整形・圧縮:タグの階層ごとにインデントし、テキストとインライン要素は同じ行のまま。script と pre の中身はそのまま保持します。
URL 解析
WebURL を解析し、スキーム・ホスト・ポート・パス・クエリパラメータ・アンカーに分解します。パラメータは元の値とデコード値を並記。すべてブラウザ内で処理します。
UA 解析
WebUser-Agent を解析し、ブラウザ・バージョン・OS・デバイス種別・エンジンを判定します。判定はパターン照合による概算です。すべてブラウザ内で処理します。