経緯
php5からphp7にバージョンアップする為、プログラムソースをいじっているときに以下のソースに遭遇した。
preg_replace('/%u([a-f0-9]{4,4})/ei', 'utf8_chr(0x$1)', $_REQUEST['content']);
preg_replace()関数の第一引数である「pattern」の修飾子に「e」をつけるのはphp7で廃止された。
代替手段として
preg_replace_callback() 関数で記述できるが
preg_replace('/%u([a-f0-9]{4,4})/i', function($m){ return utf8_chr(0x$m[1]); }, $_REQUEST['content']);
のようにしてもエラーになる。
結論:hexdec()関数でString型にした0x〜を10進数に変えちゃえばいい
以下の記述にした。
$_REQUEST['content'] = preg_replace_callback('/%u([a-f0-9]{4,4})/i', function($m){ return utf8_chr(hexdec('0x' . $m[1])); }, $_REQUEST['content']);
わざわざ10進数にせずとも16進数のままで処理できる方法があるかもだけど、色々探した結果、これしか見つからなかった。
10進数だろうが16進数だろうがphp上で見られるデータとしては同じはずなのでこれで良し。
コメント