2012-01-15 13 views
0

の名前を取得、私はURLまたはローカルパスのいずれかのために画像の名前と拡張子を取得しようとしているperlは画像と拡張

入力が 可能性が前方または後方のいずれかスラッシュで指定http://test.com/hi23.gif または /local/test/hi23.gif または C:\テスト\ 323.gif または ファイル:\ BLA \あなたの入力は常にに起こっている知っている場合

#input: filename (i.e: http://test.com/hi4324.gif) 
sub getFileName 
{ 
    my $input = shift; 
    (my $filename = $input) =~ m/(\w+\.(jpg|png|gif|jpeg)$)/i; 
    return $filename; 
} 

#input: filename (i.e: hi4324.gif) 
sub getExtension 
{ 
    my $input = shift; 
    (my $extension = $input) =~ m/\w+\.(jpg|png|gif|jpeg)$/i; 
    return $extension; 
} 
+0

アルゴリズムの先端が:ちょうど*最後* frontslashまたはバックスラッシュの間でテキストのチャンクを探して、非常に最後の '.' – Tim

+1

前に、これは良い方法ですか? my($ name、undef、$ ext)= fileparse($ in_str、 "jpg"、 "png"、 "gif"); – user391986

答えて

2

3235.gif末尾に/filename.extは、単純な正規表現を使用します。

# $url has your url already 
$url =~ /.*\/(.*?)\.(.*)/; 
my ($filename, $ext) = ($1,$2); 

をしかし、それはクエリ文字列または他の様々なフォーマットで、より複雑になることがあれば、それはモジュールに引っ張って起動する方がはるかに簡単です。変数があまりにも多くなるだけです。私はいつもFile::Basenameがファイルシステムを使って作業するときにこれに最善のものであると感じました。私はそれがURLのために働くとは思わない。メインのURIモジュールは十分かもしれないようです。 URI::SplitおよびAPR::URIは、さらに柔軟性を提供します。

+0

'$ 1、$ 2'を条件なしで割り当てることは、バグを見つけにくいかもしれないので、良い習慣ではありません。 'my($ filename、$ ext)= $ url =〜m#/(。*?)\。(。*)$#'を使ってください(正規表現も修正しました)。または 'if($ url =〜...){#assignment}'を使用してください。 – TLP

0
use strict; 
use warnings; 
use File::Basename; 
my @input = qw(http://test.com/hi23.gif /local/test/hi23.gif C:\test\323.gif file:\bla\3235.gif); 

foreach my $some(@input){ 
$some =~ s!\\!/!g;   
my $basename = basename($some); 

if($basename =~ m/(.*)\.(.*)/){ 
my ($image_name,$image_extension) = ($1,$2); 
print "\nInput is $some\nImage name is = $image_name, and extension is $image_extension"; 
}; 
} 

OUTPUT 

Input is http://test.com/hi23.gif 
Image name is = hi23, and extension is gif 
Input is /local/test/hi23.gif 
Image name is = hi23, and extension is gif 
Input is C:/test/323.gif 
Image name is = 323, and extension is gif 
Input is file:/bla/3235.gif 
Image name is = 3235, and extension is gif 
+0

's!\\!/!g'の代わりに' tr /// 'を使うことができます:' $ some =〜tr#\\#/# '。 – TLP

0

ファイル名と拡張子の両方を返すサブルーチンについてはどうですか?

sub getFileNameExt { 
    my ($path) = @_; 
    return $1, $2 if $path =~ m{([^\\/.]+([^\\/]*)$)}; 
} 

for my $p (qw(
    http://test.com/hi23.gif 
    /local/test/hi23.gif 
    C:\test\323.gif 
    file:\bla\3235.gif)) { 

    printf "%s - %s\n", getFileNameExt($p); 
} 

OUTPUT

hi23.gif - .gif 
hi23.gif - .gif 
323.gif - .gif 
3235.gif - .gif