PHPのhtmlspecialcharsを使いこなす
PHPでエスケープ処理をするための関数に、htmlspecialchars() があります。
htmlspecialchars() を利用すると、HTMLの中では特殊な意味を持つため直接書くことが出来ない < や > といった記号等を、正しく画面に < や > といった記号のまま出力できるような形に変換出来ます。
今回は htmlspecialchars() について実際のコードを交えながら解説します。
PHPのhtmlspecialcharsが変換する『HTMLの特殊文字』について解説
HTMLにおいては、< や > などの一部の記号は特殊な役割を持ちます。
これら特殊な記号をHTMLのソースコード上で書いても、それらの文字は書いた文字の通り画面に出力されません。
これらの特殊な記号は、特殊文字と呼ばれています。
HTMLの特殊文字とは
HTMLでは例えば次のようにコンテンツが書かれています。
<p class=”color1” id=”foo”>これはテストです</p>
このとき、< や > 等の特殊文字はHTMLのタグを示す記号として働いています。
タグを示す記号としての役割があるため、HTMLのソースコード中に出力する文章として < や > を書くと、状況によってはHTMLが想定通りに正しく表示されなくなります。
UTF-8でHTMLを記述している場合、以下の5つの記号が特殊文字として扱われます。
- シングルクォーテーション ( ‘ )
- ダブルクォーテーション ( “ )
- アンド ( & )
- 小なり ( < )
- 大なり ( > )
特殊文字と対応するHTMLエンティティの例
前項で、特殊文字にはそれぞれ特別な役割があり、HTML上で正常に書くことが出来ないことを説明しました。
では、HTMLで < や > をそのままの文字として画面に出力するにはどのようにすればいいでしょう。
HTMLにはそのための文字として、それぞれの特殊文字に対応するHTMLエンティティというものが用意されています。
HTMLエンティティは < や > を画面に出力するように用意された文字列で、それぞれの記号に対し、以下の文字列がHTMLエンティティとして対応しています。
- シングルクォーテーション ( ‘ )→ 『'』
- ダブルクォーテーション ( “ )→ 『"』
- アンド ( & )→ 『&』
- 小なり ( < )→ 『<』
- 大なり ( > )→ 『>』
< や > といった文字列をHTML上に書くと、画面にはそれらのHTMLエンティティに対応した記号が出力されるようになっています。
そのため、HTMLで画面に『<HTMLエンティティ>』と出力したい場合は、『<HTMLエンティティ>』と書くと正常に出力できるのです。
PHPで特殊文字とHTMLエンティティを変換する
前項でHTMLの特殊文字とHTMLエンティティについて解説しました。
PHPにはこれら特殊文字とHTMLエンティティを変換するための関数が用意されています。
htmlspecialcharsで特殊文字をHTMLエンティティに変換する
< や > といった特殊文字を < や > といったHTMLエンティティに変換する関数として、PHPには htmlspecialchars() という関数が用意されています。
htmlspecialchars() は htmlspecialchars( 変換対象, 変換パターン, 文字コード ) という記法で実行することが出来ます。
echo htmlspecialchars("'", ENT_QUOTES, 'UTF-8');
// 実行結果 『'』
echo htmlspecialchars('"', ENT_QUOTES, 'UTF-8');
// 実行結果 『"』
echo htmlspecialchars('&', ENT_QUOTES, 'UTF-8');
// 実行結果 『&』
echo htmlspecialchars('<', ENT_QUOTES, 'UTF-8');
// 実行結果 『<』
echo htmlspecialchars('>', ENT_QUOTES, 'UTF-8');
// 実行結果 『>』
上記コードでは htmlspecialchars( 変換対象, 変換パターン, 文字コード ) の引数のうち、第二引数の『変換パターン』には『ENT_QUOTES』という定数を与えています。
ENT_QUOTESはPHPが定数としてもっているint型の値であり、ENT_QUOTESを指定すると、特殊文字のうちシングルクォーテーションとダブルクォーテーションも変換対象に含めるようになります。
ENT_QUOTESの他には以下のような定数が用意されており、状況に応じて使い分けることが可能です。
- ENT_COMPAT(ダブルクォーテーションは変換するがシングルクォーテーションは変換しない)
- ENT_NOQUOTES(シングルクォーテーションとダブルクォーテーションを共に変換しない)
- ENT_HTML5(コードをHTML5として扱う)
このように、htmlspecialchars() を利用すれば特殊文字を簡単にHTMLエンティティに変換することが出来ます。
htmlspecialchars_decordeでHTMLエンティティを特殊文字に変換する
前述の htmlspecialchars() とは逆に、< や > といったHTMLエンティティを < や > といった特殊文字に変換するための関数として、htmlspecialchars_decode() という関数があります。
htmlspecialchars_decode() は htmlspecialchars_decode( 変換対象, 変換パターン ) という記法で実行することが出来ます。
htmlspecialchars() と違って第三引数(文字コード)は存在しないことに注意してください。
また、第二引数(変換パターン)はhtmlspecialchars() と同様の扱いです。
echo htmlspecialchars_decode(''', ENT_QUOTES);
// 実行結果 『'』
echo htmlspecialchars_decode('"', ENT_QUOTES);
// 実行結果 『"』
echo htmlspecialchars_decode('&', ENT_QUOTES);
// 実行結果 『&』
echo htmlspecialchars_decode('<', ENT_QUOTES);
// 実行結果 『<』
echo htmlspecialchars_decode('>', ENT_QUOTES);
// 実行結果 『>』
このように htmlspecialchars_decode() を利用すれば、htmlspecialchars() と同様の使い方で簡単に、HTMLエンティティを特殊文字に変換することが出来ます。