PHPの正規表現について次の質問にご回答ください。


$u = array('Yamaguchi-ken(中略)','Saitama-ken(中略)','Aichi-ken(中略)');

これらから「-ken」を置換してなくすという意図で、
$hoge = str_replace('-ken', '', $u);
という処理をしていました。

そこに「Saitama」で始まるキーワードに限り、最後尾に「1banchi」を追加する、
つまり、「'Saitama-ken(中略)'」を「'Saitama-ken(中略)1banchi'」という処理が必要になりました。
この場合「-ken」に対する処理はあってもなくてもいいとします。
そこで次の質問にご回答ください。

質問①
str_replaceで正規表現は使えないですよね?
単に確認の質問ですのでYES、NOでご回答ください。
また最初の一人にご回答いただければ他の方はご回答いただかなくて結構です。

質問②
「Saitama」で始まるキーワードに限りpreg_replaceで処理し、
それ以外の場合はstr_replaceで処理するというやり方が良いのか、
全部をpreg_replaceで処理したほうが良いのか、
あるいは他にもっと良いやり方があるのか知りたいです。
実際に動くスクリプトを用いてご解説ください。

Vista,PHP5,XAMPP,Firefoxという環境でやっています。
以上、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/12/04 01:03:26
  • 終了:2008/12/04 03:16:55

回答(2件)

id:goodvn No.1

goodvn回答回数228ベストアンサー獲得回数182008/12/04 01:26:04

ポイント35pt

質問(1)について

YES が can か cannot のどちらをさしているか分かりませんが,cannot です.できません

http://jp.php.net/manual/ja/function.str-replace.php


質問(2)について

PHP の正規表現より,Perl互換正規表現のほうが,速度の点でも,可読性の点でも,拡張性の点でも優れているので,preg_replace がよいと思います

$u = preg_replace('/-ken/', '', $u);
$u = preg_replace('/^(Saitama.*)$/', '$1 1banchi', $u);

これでどうですか?

id:taroemon

ご回答ありがとうございます。


質問(1)の疑問が解消されました。


質問(2)のご回答についてですが、

処理すべきデータが数千件ある場合、ifで場合わけした方が早いのではないでしょうか?

もしifを使った方が良い場合、「Saitama」で始まるならというifの条件処理の仕方がわかりません。

それともこれはこのままでよいのでしょうか?


私の質問の説明不足で申し訳ありません。引き続きご回答をお待ちします。

2008/12/04 02:41:07
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012008/12/04 03:06:02

ポイント35pt

goodvn氏の回答を一部おかりしますと・・・

$u = str_replace('/-ken/', '', $u);
$u = preg_replace('/^(Saitama.*)$/', '$1 1banchi', $u);
  • ken の除去には正規表現は必要ありませんから

上記のように変更することは可能です。


Saitamaが含まれているかどうかという判定は

preg_replaceの正規表現の部分で行っているのですから

これとは別にIF文判定などを行う事は二度手間というか

何のために正規表現を使っているのかという話になります。

id:taroemon

ご回答ありがとうございます。


>何のために正規表現を使っているのかという話になります。

そうですか。よく知らないで質問しました。すみません。

でも正規表現に関して新しい知識ができてよかったです。

2008/12/04 03:16:52
  • id:kn1967
    str_replaceの中でも-kenが含まれているかどうかという判定をしている訳ですから
    正規表現だけがそういった判定をしている訳でもないです。

    phpには多数の関数があるため今回のように
    どこに何を使うのが適材適所なのかという疑問は常に付き纏いますし
    そういった知識を増やすためや確認するために質問するのですから
    遠慮なさることはないと思います。
    (ポイントという対価も支払ってもいますしね)
  • id:taroemon
    kn1967さん

    再度のコメントありがとうございます。
    そう言って頂けると気も休まります。
    また質問しますのでお時間のあるときにご回答ください。
  • id:goodvn
    正規表現は処理が重い,という情報を気にされてるんだと思います

    もちろん,これは嘘ではありません.そして,処理の重いものより,軽いものを探すのは,プログラマとしては正しい姿です

    しかし,それがどれほどの差異か検証されましたか?

    処理の重さの比較でいえば,str_replace ならクロック100回で処理できるのが,正規表現だとクロック10,000回掛かるよね,という場合,確かに100倍違います(数字は適当です)

    しかし,PHP の実行には,ネットワークからパケットを accept,httpd を呼び出し,PHP を実行,ディスクの I/O が発生,メモリに展開,実行,そして結果をまたネットワークで返す,というような一連の処理の中で,この処理の,9,900 クロックが,どれほどの差異でしょうか?(ちなみに,CPU が 2GHz で動いてる場合,1秒に 2,000,000,000クロック進みます)

    数千件とおっしゃってますが,それくらいのデータ数だと,上記コードは一瞬(1秒未満)で実行が終わってしまうでしょう

    処理対象が 1TB くらいあって,それを 1分でも短くしたい,という要件なら,この数クロックの差は大きいかもしれません.でも,数千件程度のデータの処理を,正規表現か否かなんてのは,誤差程度の差しか出ないと思います

    もし id:taroemon さんが SE なら,細かいコードで悩まれるのも大切ですが,こうしたシステム全体の動き,その中での重要度を見通すのも大切と思います
  • id:taroemon
    goodvnさん
    お返事遅れてすみません。

    >細かいコードで悩まれるのも大切ですが,こうしたシステム全体の動き,その中での重要度を見通すのも大切と思います
    僕はSEどころかすぶの初心者です。

    まだ本とかを参考にしている段階ですので、
    そこに「好ましくない」等書かれていれば鵜呑みにしてしまいますが、
    今の僕には重い、軽いをまったく考える必要はありませんね。
    気をつけれるところは気をつけるとしても、
    あまり神経質にならなくてよいというご指摘は重要なことかもしれません。
    大変参考になりました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません