2012-01-15 35 views
0

我试图获取名称和图像的扩展的URL或用向前或向后指定的本地路径名斜杠的perl得到的图像和延伸

输入可以是 http://test.com/hi23.gif 或 /local/test/hi23.gif 或 C:\测试\ 323.gif 或 文件:\ BLA \ 3235.gif

#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 2012-01-15 02:25:50

+1

这是一个更好的办法? my($ name,undef,$ ext)= fileparse($ in_str,“jpg”,“png”,“gif”); – user391986 2012-01-15 02:36:30

回答

2

如果你知道你的投入总是要以结尾,然后用一个简单的正则表达式:

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

但如果它可以与查询字符串或其他各种格式比较复杂,那么它更容易启动模块拉动。变得太多了。在使用文件系统时,我总是发现File::Basename是最适合此用途的。不过,我认为这不适用于网址。主要的URI模块看起来可能就足够了。 URI::SplitAPR::URI可能会提供更多的灵活性。

+0

在没有条件的情况下分配'$ 1,$ 2'不是好习惯,因为它可能很难检测到错误。使用'my($ filename,$ ext)= $ url =〜m#/(。*?)\。(。*)$#'(是的,修正了正则表达式)。或者使用'if($ url =〜...){#assignment}'。 – TLP 2012-01-15 15:56:37

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

你可以使用'tr ///'代替s!\\!/!g':'$ some =〜tr#\##/#'。 – TLP 2012-01-15 16:00:10

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); 
} 

输出

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