正規表現でディレクトリ内のファイル名にマッチさせたいんですがどうすればいいかわかりません。



http://aaa.com/bbb/ccc.jpg
http://ddd.com/eee/fff/ggg.gif
http://hhh.com/iii.png

上のような例で条件として
ディレクトリの階層が違ったりするのと
ファイルの拡張子が一致しなかったりします。

つまり最下層のディレクトリ内のファイルに
マッチさせたいんですがわかりません。
どなたか助けてください。お願いします。
言語はPHPです。

回答の条件
  • 1人2回まで
  • 登録:2007/10/29 01:23:53
  • 終了:2007/11/01 10:13:37

ベストアンサー

id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252007/10/29 10:10:41

ポイント40pt

以下のような正規表現でマッチできると思います。

<?php
//$url = 'http://example.jp/foo/bar.gif';
//$url = 'http://example.jp/foo/bar.gif#hoge';
$url = 'http://example.jp/foo/bar.gif?hoge=fuga';
if(preg_match('/([^\/]+?)([\?#].*)?$/', $url, $matches)) {
        $filename = $matches[1];
}
?>

説明

  • [^\/]+ は / 以外の文字の連続で、$ は末尾です。
  • なので、([^\/]+)$ はURL中のファイル名を表します。
  • URLの場合、静的ファイルでも適当なパラメータ(?hoge=fuga)やハッシュ(#hoge)が付く場合があるので、その考慮として ([\?#].*)? を付けています。
  • [\?#].* は ? か # で始まる全てです。それを ()? で囲うことであってもなくてもよいようにしてます。
  • 上の例では http://example.jp/foo/ のように / で終わるURLの場合はマッチしません。
id:jinchangz

返事が遅れてしまいすいません。

試してみたところうまくいきました。ありがとうございます。

2007/11/01 10:04:44

その他の回答(1件)

id:wizemperor No.1

wizemperor回答回数379ベストアンサー獲得回数522007/10/29 02:37:53

ポイント30pt

質問からすると、ファイルのリストは既に取得してあり、文字列として格納されているということですよね?

$str = 'http://ddd.com/eee/fff/ggg.gif'
$filename = preg_match('!^(?:.*[/\\])?(.*)$!', $str, $matches) ? $matches[1] : '';

こんな感じではどうですか?

配列にファイルのリストが入っているなら、

$str[] = 'http://ddd.com/eee/fff/ggg.gif'
$str[] = 'http://ddd.com/eee/ggg.gif'

foreach($str as $value) {
  $filename[] = preg_match('!^(?:.*[/\\])?(.*)$!', $str, $matches) ? $matches[1] : '';
}

こんな感じで。


http://aaa.com/bbb/ccc.jpg

http://ddd.com/eee/fff/ggg.gif

http://hhh.com/iii.png

C:\hhh.com\iii.png

iii.png

全てにマッチすると思います。

id:jinchangz

返信が遅れてスイマセン。

いろいろ試してみたんですがエラーが出てしまいうまくいきませんでした。

お手数かけてすいません。

2007/11/01 10:03:24
id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252007/10/29 10:10:41ここでベストアンサー

ポイント40pt

以下のような正規表現でマッチできると思います。

<?php
//$url = 'http://example.jp/foo/bar.gif';
//$url = 'http://example.jp/foo/bar.gif#hoge';
$url = 'http://example.jp/foo/bar.gif?hoge=fuga';
if(preg_match('/([^\/]+?)([\?#].*)?$/', $url, $matches)) {
        $filename = $matches[1];
}
?>

説明

  • [^\/]+ は / 以外の文字の連続で、$ は末尾です。
  • なので、([^\/]+)$ はURL中のファイル名を表します。
  • URLの場合、静的ファイルでも適当なパラメータ(?hoge=fuga)やハッシュ(#hoge)が付く場合があるので、その考慮として ([\?#].*)? を付けています。
  • [\?#].* は ? か # で始まる全てです。それを ()? で囲うことであってもなくてもよいようにしてます。
  • 上の例では http://example.jp/foo/ のように / で終わるURLの場合はマッチしません。
id:jinchangz

返事が遅れてしまいすいません。

試してみたところうまくいきました。ありがとうございます。

2007/11/01 10:04:44

コメントはまだありません

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

トラックバック

  • urlからファイル名を取得 &gt;|ruby| def get_filename url url =~ /([^¥/]+?)([¥?#].*)?$/ $&amp; end url = ”http://www.example.co.jp/foo/bar/image.jpg” filename = get_filename url p filename # image.jpg ||&lt; 参考 正規表現でディ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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