いつも何も考えずにタグを制御したいだけなので、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;』になるわけですよ。
非常に気持ち悪い。
そこで元に戻す方法。
仮に対象が『$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);
のがいいかもしれないね。
コメント