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