今日、昔のサイトを修正していたら、PHP初心者のころ作ったPHPプログラムで、なんだかなつかしい書き方を見つけました。
見ての通り、htmlspecialchars()でエンティティ化された文字列を、もとに戻す関数です。
function unhtmlspecialchars( $str ){
$entry = array_flip( get_html_translation_table( HTML_SPECIALCHARS ) );
return strtr( $str, $entry );
}
たしか当時、一生懸命検索して方法を調べた記憶があります。
(当時はこの情報は少なかったと思います)
でも今思うと、何でこんな関数が必要だったのかが不思議です。だって、echoする直前にエンティティ化しますから、それをもとに戻すシーンが無いからです。
私の場合、こんな感じの関数を定義してその都度h()して出力しています。ぬけがあるといやなので、かなり富豪的にh()しちゃってます。
function h($value, $charset = null) {
if (is_array($value)) {
return array_map('h', $value, array_fill(0, count($value), $charset));
}
// 定数にエンコーディングが指定されていたらそれを使う
if (is_null($charset) && defined('ENCODING')) {
$charset = ENCODING;
}
if (is_null($charset)) {
$charset = 'UTF-8';
}
return htmlspecialchars($value, ENT_QUOTES, $charset);
}
$string ='こんな文字でも大丈夫''""<>';
echo h($string);
ご丁寧にhtmlspecialchars($str, ENT_QUOTES)とやるのが面倒で楽をしようとしたり(省略する関数を作ろうとすることさえ思いつかなかった)、そもそもDBに入れる前にエンティティ化してたりとか、ロジック自体に問題もあったのでしょう。
そういえば、PHP5では、unhtmlspecialchars()的な関数、htmlspecialchars_decode()というのがあるみたいですね。
まあ使う機会はそうないでしょうが……
とにもかくにも、なんだか昔のコードって、見てると楽しいですね。
今書いてるコードも、数年後に見たらダメな所もたくさんあるんだろうなぁ。
コメント