mb_encode_numericentityとは


マニュアル
http://www.php.net/manual/ja/function.mb-encode-numericentity.php
http://www.php.net/manual/ja/function.mb-decode-numericentity.php


文字を数値参照に変換してくれる関数なのだが
変換したい領域の指定方法が複雑だったので書いておく


領域は第二引数に配列で指定する
添字0がUnicode値の始まり、1が終わり、2が変換後の位置、3がマスク値である
領域を複数指定するには、同じ順序で値を追加してやる
つまり2つ目の領域を指定するには添字の4から7を使う、3つ目は8から11を使う

<?php
$string = "<>";
$convmap = array(
    0x3C, 0x3C, 0, 0xFFFF, // <
    0x3E, 0x3E, 0, 0xFFFF  // >
);
$result = mb_encode_numericentity($string, $convmap, "UTF-8");
var_dump($result); // string(10) "&#60;&#62;"


添字2の値は変換後の数値に加算され、そのあとで添字3の値でマスク(ビット演算の&)される

<?php
$string = "<>";
$convmap = array(
    0x3C, 0x3C, 2, 0xFFFF, // <
    0x3E, 0x3E, 2, 0xFFFF  // >
);
$result = mb_encode_numericentity($string, $convmap, "UTF-8");
var_dump($result); // string(10) "&#62;&#64;"


mb_decode_numericentityはその逆を行う
数値参照から添字2の値を引いた値が領域に含まれる場合はそれを文字に戻す
添字3の値は無視される

<?php
$string = "<>";
$convmap = array(
    0x3C, 0x3C, 0, 0xFFFF, // <
    0x3E, 0x3E, 0, 0xFFFF  // >
);
$result = mb_encode_numericentity($string, $convmap, "UTF-8");
var_dump($result); // string(10) "&#60;&#62;"

$result = mb_decode_numericentity($result, $convmap, "UTF-8");
var_dump($result); // string(2) "<>"