str_replaceとpreg_replace

このQ&Aのポイント
  • phpで文字化けしそうな文字を機種依存しない文字に置換する方法について質問します。
  • コードサンプルAとコードサンプルBの違いにより、置換が機能しない問題が発生しています。
  • 80,000件のコメントに置換をかけるため、効率的な置換方法を検討しています。
回答を見る
  • ベストアンサー

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/

  • PHP
  • 回答数1
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

ダブルクオートでくくって展開させれば解決します。 $arr = array("\xE3\x8A\x91" => '(株)', ………); return str_replace(array_keys($arr), array_values($arr), $str); でもせっかく「キー => 値」の形式で格納しているなら、わざわざstr_replaceなんて使わなくてもstrtrでいいと思いますが。このブログの方はstrtr関数の存在を知らなかったのでしょう。 $arr = array("\xE3\x8A\x91" => '(株)', ………); return strtr($str, $arr); str_replaceとstrtrの違いに関してはこちらのコメント欄を参照してください。 http://qiita.com/suin/items/cbbbe8844fd734fa20e2

chiku-san
質問者

お礼

実に明瞭なご回答をありがとうございました! なるほど、理解が深まりました。 心より感謝御礼申し上げます。 今後とも宜しくお願い申し上げます!

関連するQ&A

  • preg_replace ereg_replace

    いつもお世話になっております。 データを抽出する前にサニタイズが必要となり、 実行する処理で、 $rep = "/\\\/"; $arr = array('data1' => 'A', 'data2' => '\\\\\\'); $ret = preg_replace($rep , "\\\\\\" ,$arr ); $ret = ereg_replace("'", "\'" ,$ret); preg_replaceは配列で戻ってくる事は知っているのですが、 ereg_replaceは配列で戻ってくるのでしょうか。 お手数ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • preg_replaceで改行が含まれてしまう

    preg_replaceを使って置換をしようと思い、 $str = <<< END test test ;comment test END; $fstr = preg_replace("/;(.*$)/m", "<>;\\1<>", $str); echo $fstr; と言うようにやってみたのですが、置換した文字の後に改行が入ってしまいます どのようにすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • phpのpreg_replaceで質問です

    お世話になります phpのpreg_replaceで質問です 下記の様な記述にて文字列の置換をしています $body = preg_replace("/cid:(\d{2,})@(\d{6}).(\d{6})/","/bl/id/$1/",$text); コレを改良してcidの次に入る値で処理を分けたいのですが、うまくいきません。 どなたかご教授お願い致します $arr = array("gif","jpg"."png"); $body = preg_replace("/cid:(\d{2,})@(\d{6}).(\d{6})/","/bl/id/$1/$arr[$1]",$text); 宜しくお願い致します

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • preg_replaceの正規表現を教えて下さい。

    preg_replaceの正規表現を教えて下さい。 元:'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ' 後:'あいうえお<meta content=\"text/html; charset=utf-8" />かきくけこ' というように、charset= に続く部分を preg_replaceで置換したいのですが、スキル不足でできません。 $a = 'あいうえお<meta content=\"text/html; charset=Shift_JIS" />かきくけこ'; $p = "/<meta.*charset=([^\"']+)[^>]/i"; $x = preg_replace( $p, "utf-8", $a ); とやってみましたが、$xには、全く期待通りの結果は得られませんでした。 この置換を実現できる正規表現を教えて下さい。

    • ベストアンサー
    • PHP
  • preg_replaceにおけるeオプション

    文字列$strは、「aa:bb」という文字列を含み、$flagが1のときは、この部分を「aa」に。0のときは「bb」に置き換えるという処理で、 $str = preg_replace("/(.*):(.*)/e","($flag) ? $1 : $2", $str); とするも、うまくできません。 http://www.jp.u4ia.net/~tkyng/php/php_manual_i18n/function.preg-replace.html こちらのサイトの一番下にe修飾の使い方がのっているのですが、これを真似てもうまくいきません。 e修飾の使い方を教えてください。

    • ベストアンサー
    • PHP
  • str_replaceで文字化け

    お世話になります。 PHPでstr_replaceを使用しましたら、 「ー」や「・」などの文字が、文字化けを してしまいました。 いろいろ調べたのですが、よく分からずに 困っています。 PHPで文字の置換を行いながら、文字化けを しない方法はどのようにしたらよいのでしょうか。 $abc = str_replace(" ", "", $abc); のあとに$abcを出力しましたら、文字化けをして しまいました。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP preg_replace のリンク作成

    PHPで作成している掲示板にて、 本文中の「>>5」を押すと、A_id=10&B_id=3 のメッセージを表示する機能を作っています。 10が「A_id」となります。 イメージ:http://XXXX.jp/show.php?A_id=10&B_id=3 $str = preg_replace('/^>>([0-9]+)/','<a href="show.php?A_id=\\1&B_id=★">\\0</a>',$str); A_id=\\1 には10など数字が設定できてます。 B_id=の★部分に、3などの数値を「変数」で設定することができません。 ($B_id_num など) どのようにすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • preg_replaceを使って特定の文字を削除したいと思っています。

    preg_replaceを使って特定の文字を削除したいと思っています。 具体的には $name = "青木太郎(男)"; の(男)の部分を取り除いて $name = "青木太郎"; にしたいのですが正規表現が分からないためうまくいきません。 preg_replace("/(*)/", "", $name); などとしてみたのですがエラーになってしまいます。 括弧から括弧までの文字を丸ごと削除するにはどのようにしたらいいでしょうか。 文字コードはUTF-8です。

    • ベストアンサー
    • PHP
  • preg_replace 英数字以外の文字の前後のスペースを削除

    preg_replaceで 英数字の前後いずれかのスペースは残して それ以外のスペースを消したいのですが あ a間が消えてしまいます。(英数字前なので消さない) a aはのこるので英数字後のスペースは残せてます。 <?php $str = \"あ a a\"; $txt = preg_replace(\"/([^a-zA-Z\\d])\\s+/u\", \"$1\", $str); echo $txt;

    • ベストアンサー
    • PHP

専門家に質問してみよう