数値文字参照を文字に変換(PHP)

さんざん悩んでちょっと方向転換してみたら、「あー、そういえばあったかも」って事に。

  • mb_encode_numericentity
  • mb_decode_numericentity

mb_decode_numericentity 関数を使って(10進数の)数値文字参照を文字に変換する事が出来る。以下は、(とりあえず)UTFに限定しておいて処理するお試しコード。

function nument2chr($string) {
    // 文字コードチェック
    $encoding = strtolower(mb_detect_encoding($string));
    if (!preg_match("/^utf/", $encoding) and $encoding != 'ascii') {
        return '';
    }
    // 16 進数の文字参照(らしき表記)が含まれているか
    $excluded_hex = $string;
    if (preg_match("/&#[xX][0-9a-zA-Z]{2,8};/", $string)) {
        // 16 進数表現は 10 進数に変換
        $excluded_hex = preg_replace("/&#[xX]([0-9a-zA-Z]{2,8});/e", "'&#'.hexdec('$1').';'", $string);
    }
    return mb_decode_numericentity($excluded_hex, array(0x0, 0x10000, 0, 0xfffff), "utf-8");
}

10 進数じゃなきゃ駄目っぽいので、16 進数っぽい表記を見つけたら置換しましょうってしてるつもり。この"16 進数"の範囲は適当。convmap も php.net に書いてあったそれっぽい物をそのまま利用。パフォーマンス的にも普通の HTML ファイルを対象にして即レスポンスが返ってくる感じ(ベンチマークはしてません)。

もうやらなくていい事になったんだけど、やりたかった事は『最終的な成果物の段階でHTMLソースに含まれた数値文字参照を文字として表現する』という事。上記処理で文字に戻して DB に入れたらいいのかな?変換できない参照コードは空文字(strlen で 1 が返る)になるっぽいから、その辺をどうしたらいいのかなと思うんだけど、対象が『HTMLソース』なわけだし、おかしな文字参照があったらそれはその著者が悪いという事で。

mb 関数はどこまで信じていいのか微妙だったりするけど、まあ使える物は使いましょう。後は、上手くまとめて HTML 文字クラスみたいなの作ったら色々便利かな?ソースを取り込んで to_display() と to_source() で取り出したり。

RCDATA って DB とかに保存する場合 CDATA にして保存するべき?この辺のポリシーとか知りたい。

プロフィール

このブログ記事について

このページは、koshigoeが2006年5月 9日 23:58に書いたブログ記事です。

ひとつ前のブログ記事は「早速スパムなコメント」です。

次のブログ記事は「PS3 って 59,800円もするんだ…」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。