Webサイト制作におけるPHPの基本(その3:htmlspecialchars関数と特殊文字)

Webサイト制作において、フォームなどでユーザーからの入力を受けとる際に用いられるhtmlspecialchars関数と、その際に必要となる特殊文字の扱いについてまとめておく。

htmlspecialchars関数

HTMLには特殊な意味(役割)を持っている文字(特殊文字)があり、その文字をHTMLでの意味(役割)としてではなく、ただの文字(見た目は記号)として表示する(させる)ために文字参照値(という言い方が正しいかどうかは分からないが)に置き換える機能を持つ関数。
フォームなどでユーザー(他者)からの悪意ある入力を無害化するのに用いられ、安全性を高めるためにも指定しておくことが望ましい。

書き方は以下の通り。

htmlspecialchars('文字列',エスケープの種類,'文字コード')

上記のような置き換えの機能を「HTMLエスケープ」と呼び、htmlspecialcharsの括弧内で、その種類(方法)を指定する。これらは文字列ではなく定数扱いになるためクォートで囲む必要はない(囲んではいけない)。
いくつか種類があるようだが、とりあえず以下の3つをメモしておく。

エスケープの種類(方法) 概要
ENT_COMPAT ダブルクォートは置き換えるが、シングルクォートは置き換えない
ENT_QUOTES シングルクォートとダブルクォートの両方を置き換える
ENT_NOQUOTES シングルクォートとダブルクォートの両方を置き換えない

※参照http://php.net/manual/ja/function.htmlspecialchars.php

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>htmlspecialchars確認</title>
</head>
<body>
<?php
print (htmlspecialchars(' "ダブル" ',ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_COMPAT,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "ダブル" ',ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_QUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(' "ダブル" ',ENT_NOQUOTES,'UTF-8').'<br>')."\n";
print (htmlspecialchars(" 'シングル' ",ENT_NOQUOTES,'UTF-8').'<br>')."\n";
?>
</body>
</html>

以下、表示結果。
←クリックで拡大表示

また、よく使う特殊文字文字参照は以下の通り。

特殊文字 文字実体参照 数値文字参照 名前、呼び方、意味
" &quot; &#034; ダブルクォート
' &apos; &#039; アポストロフィ
& &amp; &#038; アンパサンド
< &lt; &#060; 小なり
> &gt; &#062; 大なり
/ &frasl; &#047; スラッシュ
  &nbsp; &#160; スペース(空白)
© &copy; &#169; コピーライト
« &laquo; &#171; 左引用
» &raquo; &#187; 右引用

以下、特殊文字文字参照の確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>特殊文字と文字参照</title>
<style>
table {
 border: solid 1px;
 border-collapse: collapse; 
 border-spacing: 0;
 margin-bottom: 10px;
}
th {
 border: solid 1px;
 padding:5px;
 background-color:#CCC;
}
td {
 border: solid 1px;
 padding:5px;
}
</style>
</head>
<body>
<table border="1">
<tr>
<th>名前</th>
<th>表示(記号)</th>
<th>文字参照</th>
</tr>
<tr>
<td rowspan="3">ダブルクォート</td>
<td>&#034;</td><td>&amp;#034;</td>
</tr>
<tr>
<td>&#34;</td><td>&amp;#34;</td>
</tr>
<tr>
<td>&quot;</td><td>&amp;quot;</td>
</tr>
<tr>
<td rowspan="3">アポストロフィ</td>
<td>&#039;</td><td>&amp;#039;</td>
</tr>
<tr>
<td>&#39;</td><td>&amp;#39;</td>
</tr>
<tr>
<td>&apos;</td><td>&amp;apos;</td>
</tr>
<tr>
<td rowspan="3">アンパサンド</td>
<td>&#038;</td><td>&amp;#038;</td>
</tr>
<tr>
<td>&#38;</td><td>&amp;#38;</td>
</tr>
<tr>
<td>&amp;</td><td>&amp;amp;</td>
</tr>
<tr>
<td rowspan="3">小なり</td>
<td>&#060;</td><td>&amp;#060;</td>
</tr>
<tr>
<td>&#60;</td><td>&amp;#60;</td>
</tr>
<tr>
<td>&lt;</td><td>&amp;lt;</td>
</tr>
<tr>
<td rowspan="3">大なり</td>
<td>&#062;</td><td>&amp;#062;</td>
</tr>
<tr>
<td>&#62;</td><td>&amp;#62;</td>
</tr>
<tr>
<td>&gt;</td><td>&amp;gt;</td>
</tr>
<tr>
<td rowspan="3">スラッシュ</td>
<td>&#047;</td><td>&amp;#047;</td>
</tr>
<tr>
<td>&#47;</td><td>&amp;#47;</td>
</tr>
<tr>
<td>&frasl;</td><td>&amp;frasl;</td>
</tr>
<tr>
<td rowspan="2">スペース(空白)</td>
<td>&#160;</td><td>&amp;#160;</td>
</tr>
<tr>
<td>&nbsp;</td><td>&amp;nbsp;</td>
</tr>
<tr>
<td rowspan="2">コピーライト</td>
<td>&#169;</td><td>&amp;#169;</td>
</tr>
<tr>
<td>&copy;</td><td>&amp;copy;</td>
</tr>
<tr>
<td rowspan="2">左引用</td>
<td>&#171;</td><td>&amp;#171;</td>
</tr>
<tr>
<td>&laquo;</td><td>&amp;laquo;</td>
</tr>
<tr>
<td rowspan="2">右引用</td>
<td>&#187;</td><td>&amp;#187;</td>
</tr>
<tr>
<td>&raquo;</td><td>&amp;raquo;</td>
</tr>
</table>
</body>
</html>

以下、表示結果。

結果から、数値文字参照が二桁のものは、前に「0」をつけて三桁にしても二桁のままでも結果は変わらないことが分かる。

※参照情報
文字参照http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8F%82%E7%85%A7
文字参照http://www.mirai-net.jp/skill/tool/html_moji.html
予約語http://e-words.jp/w/E4BA88E7B484E8AA9E.html
HTML特殊文字http://e-words.jp/p/r-htmlentity.html
HTML特殊文字http://pst.co.jp/powersoft/html/index.php?f=3401
HTML特殊文字http://w-d-l.net/html__entities/
HTML特殊文字http://www.cielion.com/jp/reference/html/special_characters.php
シングルクォートの扱いについてhttp://babyp.blog55.fc2.com/blog-entry-808.html