PHPの正規表現を用いて下記のスクリプトを作成してください。


次のような配列があるとします。
$url = array(
'http://www.yahoo.co.jp',
'http://q.hatena.ne.jp',
'http://www.google.co.jp'
);

http://q.hatena.ne」を含む要素の最後尾に
「/hoge」を追加するというスクリプトを作成してください。

つまり、$urlは下記のとおりになるということです。
$url = array(
'http://www.yahoo.co.jp',
'http://q.hatena.ne.jp/hoge',
'http://www.google.co.jp'
);

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

回答の条件
  • 1人2回まで
  • 登録:2008/12/04 05:48:17
  • 終了:2008/12/04 21:45:49

回答(2件)

id:kn1967 No.1

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

ポイント60pt

変数$urlの中身が質問どおりの形式を保つのであれば

  $url = array(
        'http://www.yahoo.co.jp',
        'http://q.hatena.ne.jp',
        'http://www.google.co.jp',
  );
  $url = preg_replace("/^(http:\/\/q.hatena.ne.jp)$/i","$1/hoge",$url);
  print_r($url);

で結果としては

Array
(
    [0] => http://www.yahoo.co.jp
    [1] => http://q.hatena.ne.jp/hoge
    [2] => http://www.google.co.jp
)

となりますし

$url = str_replace('http://q.hatena.ne.jp','http://q.hatena.ne.jp/hoge',$url);

でも同じ結果を得られますが

実際には末尾がスラッシュで終わっていたり

サブディレクトリが存在していたりといった事もあるかと思いますので

  $url = array(
        'http://q.hatena.ne.jp/fuga/',
        'http://q.hatena.ne.jp/fuga/fuga/',
        'http://q.hatena.ne.jp/fuga',
        'http://www.yahoo.co.jp',
        'http://q.hatena.ne.jp',
        'http://www.google.co.jp',
        'http://q.hatena.ne.jp/'
  );
  $url = preg_replace("/^(http:\/\/q.hatena.ne.jp)((\/[^\/]+)*)\/*?$/i","$1$2/hoge",$url);
  print_r($url);

として結果は

Array
(
    [0] => http://q.hatena.ne.jp/fuga/hoge
    [1] => http://q.hatena.ne.jp/fuga/fuga/hoge
    [2] => http://q.hatena.ne.jp/fuga/hoge
    [3] => http://www.yahoo.co.jp
    [4] => http://q.hatena.ne.jp/hoge
    [5] => http://www.google.co.jp
    [6] => http://q.hatena.ne.jp/hoge
)

のようにしたほうが良いかと・・・。

(同様にereg系でも可能ですが、全般的にpreg系のほうが高速と言われてますし

php流の正規表現とperl流の正規表現を同時期に覚えていくのは面倒ですから

個人的にはpreg系列だけにまずは注視されることを勧めます)

id:taroemon

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

下のコメントも拝見しました。丁寧にありがとうございます。

僕にとって正規表現はまだまだ理解したいものですが、

今回のご回答で大変勉強になりました。

2008/12/04 21:44:34
id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252008/12/04 10:03:38

ポイント25pt
<?php
$url = array(
'http://www.yahoo.co.jp',
'http://q.hatena.ne.jp',
'http://www.google.co.jp'
);

foreach($url as $key => $value) {
    if(preg_match('/http:\/\/q\.hatena\.ne/', $url)) {
        $url[$key] .= '/hoge';
    }
}
?>
id:taroemon

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

preg_replaceしか頭にありませんでしたが、

こういうやりかたもあるんですね。

大変参考になりました。

2008/12/04 21:45:13
  • id:kn1967
    回答1は一括処理
    preg_replaceではピリオドをエスケープする必要がありますが
    それが抜けておりました。
    正規表現を用いる場合はq.hatena.ne.jpの部分はq¥.hatena¥.ne¥.jp
    のようにエスケープしてください。
    回答2は1件毎に処理
    preg_matchの2番目のパラメータは$urlではなく$value

    正規表現などで処理可能なら一括処理が便利ですが
    正規表現が複雑になりすぎる場合などは
    動作コスト(動作する際の処理時間)がバカにならない場合もありますし
    複雑な正規表現は後々になってメンテナンスする際に
    読み取るのが難しくなりますので回答2にありますように
    arrayの要素1つずつに対して処理するようにプログラムを組むほうが
    良い場合もあります。

    結局のところ
    どちらを選択するのが作成中のシステムに合致するのかは
    使用状況を見越したテストプログラムを作成して比較する事が必要になり
    それ相当のスキルが要求されてしまいますので
    まずは、思い通りに動かす事を目指して
    自分がより理解している方法(より理解しやすい方法)を
    選択されることを強くお勧めします。

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

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

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

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