php 0x 結合 = String to 0x =「0x」と「12」を結合して16進数「0x12」にしたい)

php
スポンサーリンク

経緯

 

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上で見られるデータとしては同じはずなのでこれで良し。

コメント