unhtmlspecialchars()なんてそう言えば作ったなぁ

今日、昔のサイトを修正していたら、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()というのがあるみたいですね。

まあ使う機会はそうないでしょうが……

とにもかくにも、なんだか昔のコードって、見てると楽しいですね。

今書いてるコードも、数年後に見たらダメな所もたくさんあるんだろうなぁ。

コメント

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