2012-10-12 55 views
0

我需要刪除變量中的最後一個頁面名稱。刪除字符串中的最後一個URL名稱

這是到目前爲止我的代碼,但我鬆散的jpg擴展,我需要保護它,所需的結果:ImageName256.jpg

#!/usr/bin/perl 

print "Content-type: text/html\n\n"; 

use CGI qw(:standard); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 


$Variable = "http://www.MyDomain.com/SomefolderPath/ImageName256.jpg"; 

($LastInUrl) = $Variable =~ m(.*/(\w+)); 

print $LastInUrl; 

回答

-3
($LastInUrl) = (split qr{/}, $Variable)[-1]; 
+3

未能爲'http://www.example.org/foo%2Bbar.jpg?cow = moo' – ikegami

+0

(返回'foo%2Bbar.jpg?cow = moo'而不是'foo + bar.jpg'。) – ikegami

4
use URI qw(); 
my $uri = "http://www.MyDomain.com/SomefolderPath/ImageName256.jpg"; 
$uri = URI->new($uri); 
my $basename = ($uri->path_segments)[-1]; 

如果你想繼續使用正則表達式,你'必須使用以下內容:

use URI::Escape qw(uri_unescape); 
my $uri = "http://www.MyDomain.com/SomefolderPath/ImageName256.jpg"; 
my $basename = $uri =~ m{/([^/#?]*)(?=[#?]|\z)} ? uri_unescape($1) : ''; 

很明顯,我強烈推薦第一種方案。

+0

一個警告:通過'http:// example.com/foo'將返回'foo'但'http://example.com/foo /'將返回一個空字符串。由於OP希望將文件關閉,這可能是好的,但我想我會記下它。 – Schwern

+0

@Schwern,'http:// example.com/foo'和'http:// example.com/foo /'是非常不同的URL。預計會返回不同的值。最後一段爲空時返回一個空字符串,這聽起來很合適。 – ikegami

+0

我同意這種行爲是完全正確的,可能不是OP想要的。 – Schwern

5

我通常會避免這樣的事情正則表達式和處理這樣的:

#!/usr/bin/perl 

use strict; 
use warnings; 

use URI; 
use URI::Escape qw(uri_unescape); 
use File::Basename; 

my $variable = "http://www.MyDomain.com/SomefolderPath/ImageName256.jpg"; 
my $last_in_url = uri_unescape(basename(URI->new($variable)->path)); 

print $last_in_url; 

注:文件::基名的行爲的變化,這取決於系統它是用來之一。你不得不使用下面的,如果你想可移植性:

+0

'fileparse_set_fstype'沒有'uri'類型,並且會忽略它無法識別的任何東西,所以'fileparse_set_fstype('uri')'是一個無操作。改爲說'fileparse_set_fstype(「Unix」)'。事實上,沒有必要分析路徑。非轉義的URI路徑中的斜線是明確的,沒有引用或轉義,就像路徑一樣。 'my($ file)= $ path =〜m {[^ /](。*)$}'但是@ ikegami的回答使用path_segments()更好。 – Schwern

+0

@Schwern,這不是一個無操作,它和'fileparse_set_fstype('Unix')'是一樣的。 – ikegami

+0

@ikegami你說得對,我誤解了代碼。 *技術上*這是該功能的記錄使用,但愚弄讀者認爲它做的不是。 – Schwern

相關問題