文字列のエスケープ

2008/04/12 | PHPの基本

例えば掲示板プログラムを作った場合、入力された文字はそのままデータベースやテキストファイルで保存して、出力するときに<や>などを変換して表示するのはよくあることだ。これには通常htmlspecialchars関数を使用する。しかしこの関数、実は奥深い。
まずhtmlspecialcharsとよく似た働きをする関数にhtmlentitiesという関数がある。両者の違いは何かというと、実際に引数で与えられた文字列を変換する際に、変換する文字列の種類(というか変換する文字数)が違うのだ。基本的にhtmlspecialcharsでは「>」「<」「"」「&」だけなのだが(HTMLで使用する際に支障が出そうな文字列だけを変換)、htmlentitiesでは、&と;で囲んだ文字に変換できるものはすべて変換するのだ。htmlspecialcharsで変換されないものは、実は結構たくさんある。両者の違いは以下の2行のスクリプトを実行すればわかるだろう(普通のウェブ開発で使用することはまずないので、一回くらいは試してみてもいい)。

print_r(get_html_translation_table(HTML_ENTITIES));
print_r(get_html_translation_table(HTML_SPECIALCHARS));

つまり変換で使用する一覧を、それぞれの関数の場合で表示させることができるのだ。本来変換可能な文字列というのは、割とたくさんあることがわかるだろう。

さてhtmlspecialcharsで通常変換する文字列が「>」「<」「"」「&」と言ったが、何か気にならないだろうか。気になった人は鋭い。「'」だ。HTMLで属性の値を囲むときは通常「"」を使うが「'」も使うことが可能だ。であれば「'」も変換できたほうがいいはずだ。

実はこの「'」は、デフォルトでは変換されないのだが、htmlspecialchars関数に第二引数を与えることによって変換することができる。ちなみに第二引数でとりうる値は以下の3つだ。

ENT_COMPAT 「'」は変換せず「"」は変換(デフォルト)
ENT_quotS 「'」も「"」は変換
ENT_NOquot 「'」も「"」も変換せず

シングルクォーテーション、ダブルクォーテーションにはいろいろあるわけだ。ちなみにhtmlentitiesでも上記と同様第二引数で指定することができる。基本的に両者は同じなのだが、日本語環境でほとんどhtmlentitiesが使われないのは、例えば半角カナが割り当てられた領域も変換をかけようという処理が入ってしまうためにもろもろ不具合がでる、というところによるのだろう。

htmlspecialcharsのような一般的な関数でも、実は奥が深かったりする。前からうすうす理解はしていたのだが、しっかり調べるとなるほど納得。やはりおくが深いのだ。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net