str_replaceとpreg_replace
phpで、汎用環境で文字化けしそうな文字を,ad hoc に機種依存しない文字に置換する過程に関して質問させて頂きます。
例えば(株)を(株)に、置換等です。
宜しくお願いいたします。
こちらのページのコードで、
http://memo.xight.org/2006-06-19-13
もともと、以下のようなコードサンプルA(推測)が、
-----▼サンプルA
$arr=array('\xE3\x8A\x91' => '(株)',………);
foreach ($arr as $key => $val)
{
$str_rep = preg_replace("/$key/", $val, $str_rep);
}
-----▲
こちらの方の指摘で、
http://blog.poyo.jp/archives.php/categ-1/year-2006/month-6/id-1150817399
-----▼サンプルB
$arr=array('\xE3\x8A\x91' => '(株)',………);
return str_replace( array_keys( $arr), array_values( $arr), $str);
-----▲
コードサンプルBに、変更(改善?)されたようです。一見、なるほどと思うのですが、実際にサーバ上で試したところコードサンプルAは問題なく機能しますが、コードサンプルBは機能しません。(特殊文字にマッチしない)
私の環境の問題で機能しないだけなのか、サンプルBを提示していた方の早まりなのか、判断がつかずに困っています。
ただし、'\xE3\x8A\x91'のようなユニコード文字列を、(株)といった文字に打ち変えて実行すると、きちんと認識して、置換が行われます。
str_replaceとpreg_replaceの機能の違いによるものだと思ったのですが、今回、このコードを利用し、80,000件位のコメントに置換をかけようとしているため、少しでも早く軽く置換できる方法を探しております。
見た目的にはループで走査していくよりも、str_replaceでスパっと置換した方が早そうに感じるので、できるならばサンプルBのような書き方で置換する様をベンチマークしたいと考えております。
なぜ、コードサンプルBが機能しないのか、また、正常に機能させるためには何が必要なのか、アドバイス・ご教示頂けましたら幸いです。
ちなみにコードサンプルAの元は、以下かと思いますが、こちらはまったく問題なく機能することが確認できています。
http://www.happytrap.jp/blogs/2009/09/11/1393/
お礼
どうもありがとうございました。