HTMLで使われる特殊文字というのがある。
たとえば < とか > とかで、これらをHTMLソースに書くと画面表示上では < ならび > で表示される。
PHPには htmlentities() とか htmlspecialchars() といったネイティブ関数が用意されているが、一部の文字しか変換してくれないようだ。
本当は ASCII値を渡せばどんな文字でもhtmlentityで表現できる。
この htmlentity文字列だと、日本語のWebページに他言語のマルチバイト文字(中国語やハングル文字)などを埋め込むことができるし、メールアドレスの難読化ができて、メアド収集ロボットに対する防止になる(かもしれない)。
そこで、PHPによる変換するスクリプトを書いてみた。
※関数名は適当。&から始まる文字列になるので、ampencode()って名前にしました。
class Common { /** * 渡された文字列を WEB上でのみ表示される文字列に変換します。 * @param string $str 変換したい文字列 * @param string $encode マルチバイト文字列のエンコードの指定 * @return string 変換後の文字列 */ public static function ampencode($str = '', $encode = 'UTF-8') { $len = mb_strlen($str, $encode); $rtn = ''; for ($pos = -1; ++$pos < $len;) { $letter = mb_substr($str, $pos, 1, $encode); // ASCII文字の変換 if (strlen($letter) === 1) { $rtn .= sprintf('&#x%02x;', ord($letter)); } // マルチバイトの変換 else { $utf = mb_convert_encoding($letter, 'UTF-16', $encode); $rtn .= sprintf('&#x%02x%02x;', ord(substr($utf, 0, 1)), ord(substr($utf, 1, 1))); } } return $rtn; } }
これで渡された文字はバシバシ htmlentity化される。
Common::ampencode("sample@email.com");
出力例:
sample@email.com
マルチバイト文字もこんな感じ。
Common::ampencode("☂");
出力例:
☂
ちなみに、JavaScriptでこれだけのことをしてくれるページもあるので、ちょっと変換したいだけの場合はこちらを使うと良さげなり^^
http://thira.plavox.info/htmlentity/
最近のコメント