htmlspecialcharsとhtmlentities 変換とデコード

いつも何も考えずにタグを制御したいだけなので、htmlspecialcharsを使っていたけど、どうやらhtmlentitiesのがいいらしい。

『htmlentities』『htmlspecialchars』の違い

htmlspecialcharsはデフォルト『<』『>』『&』『"』の4つをHTMLの表現形式に変換。
対して、htmlentitiesはデフォルトで先の4つを含む100個の文字を変換。
とのこと。

つまりより厳密にエスケープしたいなら『htmlentities』を使った方がいいようだ。
ほら、javascriptとか、あるでしょ。

書き方

何でデフォルトと言ってるかっていうと『'』もした方がいいよね常考、ってことで
第2引数は『ENT_QUOTES』は決定です。

第3引数は文字化けるときに使えばいいかと思う。
直接文字コードを設定するか、

mb_internal_encoding(文字コード);

を既にどこかで実行して文字コードを設定してるなら

$now_encode = mb_internal_encoding();

みたいな感じで現在の文字エンコードを取得して設定。

でも指定する文字コードも限られてるから要注意。
日本人なら『UTF-8』『Shift_JIS』『EUC-JP』だって覚えておけば、困らないかと。
正しい文字コードを設定してないと『mb_internal_encoding()』取得値書いたところで、文字化けすることが…。

まぁ、個人的見解としては『htmlspecialchars』には文字コード設定いらんと思う。
『<』『>』『&』『"』『'』だけだし。

例としては以下な感じ。

htmlspecialchars

$text = htmlspecialchars($text,ENT_QUOTES);

htmlentities

$text = htmlentities($text,ENT_QUOTES,"UTF-8");

『htmlentities』『htmlspecialchars』の変換表

『htmlentities』『htmlspecialchars』
文字変換テーブルはget_html_translation_table関数で確認可能。

htmlspecialchars

print_r(get_html_translation_table(HTML_SPECIALCHARS));

※『HTML_SPECIALCHARS』はデフォルト値だから別に書かなくてもいい

htmlentities

print_r(get_html_translation_table(HTML_ENTITIES));

※実行前に『mb_internal_encoding(文字コード)』をしておかないと文字化けすること有。

『htmlentities』『htmlspecialchars』を元に戻す(デコード)

『実態参照』ていうらしいんだけど『&うんつら;』てのを元に戻したいときあるじゃないですか。

例えば
『&』を書きたくて、入力の際『&』を『&amp;』にしてくれたと。
でも自動変換もかかってたとするじゃないですか。
すると『&amp;amp;』になるわけですよ。
非常に気持ち悪い。

そこで元に戻す方法。
仮に対象が『$text』に入ってたとする

htmlspecialchars

$text = htmlspecialchars_decode($text,ENT_QUOTES);

htmlentities

$text = html_entity_decode($text,ENT_QUOTES,"UTF-8");

だから
さっきの問題を対処するには

htmlspecialchars

$text = htmlspecialchars(htmlspecialchars_decode($text,ENT_QUOTES),ENT_QUOTES);

htmlentities

$text = htmlentities(html_entity_decode($text,ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8");

となる

状況によっては

$text = htmlspecialchars(html_entity_decode($text,ENT_QUOTES,"UTF-8"),ENT_QUOTES);

のがいいかもしれないね。

コメント

タイトルとURLをコピーしました