2012-03-07 105 views
0

在使用Perl正則表達式將數據存儲到數據庫中之前,我需要規範化URL。使用Perl的URL正則表達式

下面是一些例子網址:

但是,每當我在 foo//嘗試下面的代碼,而不是富後只刪除了//,它會還刪除了http://中的雙斜槓。我需要保持//http://,但我不需要在foo//後轉發//。我還需要刪除可能出現在URL中任何位置的所有/..//./

基本上,這個:

"http://www.codeme.com:123/../foo//bar.html" 

應該成爲這樣的:

"http://www.codeme.com/foo/" 

我很新的使用Perl我一直忽略了它,並認爲我永遠不會需要它但是生活已經證明我是錯的。因此,如果您能帶領我走向正確的軌道,我將非常感謝您的幫助。

sub main 
{ 
     my $line; 
     open(FH, "test.txt"); 

     until(($line = <FH>) =~ /9/) { 

      $line =~ tr/A-Z/a-z/; 

      $line =~ s|//|/| ; 

      $line =~ s|\:\d\d\d|| ; 

      $line =~ s|:80||; 

      print $line; 
     } 

     close FH; 
} 
+1

我不知道,你正在尋找實現正常化是完全清楚。 'www.codeme.com:123'沒有標準化爲'www.codeme.com'。 '/../ foo // bar.html'沒有標準化爲'/ foo'。 '/..// foo/bar.html'標準化爲'/'。也許你應該嘗試闡述你想要完成的事情,因爲它看起來是非標準的。 – 2012-03-07 15:44:55

+0

你不能這樣做。 URL路徑並不是一個真正的文件系統路徑,您不應該假設它直接映射到文件。您可能想要執行HEAD請求,然後查看位置標題所代表的內容。 – 2012-03-08 02:18:08

回答

2

使用URI模塊。它會讓你的生活更美好,默認情況下它應該包含在Perl中。

http://metacpan.org/pod/URI

use URI; 

my $line; 
open(FH, "test.txt"); 

until(($line = <FH>) =~ /9/) { 
    chomp($line); # gets rid of the newline character 
    my $url = new URI($line); 
    print $url->scheme,'://',$url->host,'/',$url->path; 
} 

它應該清理的URL件適合你。

另外你真的不需要sub main。在Perl中是隱含的。

編輯正如@ spyroboy指出的那樣,這將不會標準化你的URL。你仍然需要通過一些手段來標準化這些部分,但是你想用標準化來做什麼並不是那麼清楚。

+0

不幸的是,URI模塊沒有做任何規範化。 – 2012-03-07 15:34:52

+0

這是因爲您具有不同的URI,導致服務器提供相同的內容。 – Quentin 2012-03-07 15:43:06

+0

@spyroboy OP想要規範化的內容並不是那麼清楚。這解決了清理URL並將其分解成部分應該更容易規範化的問題。我會編輯我的帖子以澄清這一點。 – Cfreak 2012-03-07 15:58:57

0

URI模塊,記錄here,是正確的路要走。它允許您將網址分成不同的組成部分並分別進行調整。這Perl程序似乎做你需要什麼

use strict; 
use warnings; 

use URI; 

for (
    'http://www.codeme.com:80/foo/../index.php', 
    'http://www.codeme.com:123/../foo//bar.html') { 

    my $uri = URI->new($_); 

    $uri->port(80); 

    my @path = $uri->path_segments; 
    @path = grep /[^.]/, @path; 
    $path[-1] = '' if grep $path[-1] eq $_, qw/ default.htm index.php /; 
    $uri->path_segments(@path); 

    print $uri->canonical, "\n"; 
} 

輸出

http://www.codeme.com/foo/ 
http://www.codeme.com/foo/bar.html 
+0

謝謝大家的支持,如果我想 – user1254916 2012-03-08 12:08:59

+0

謝謝大家的支持。如果特別向鮑羅廷請求,我還有一個要求。我如何刪除默認目錄索引defualt.htm或最後的index.php。再一次非常感謝你。 – user1254916 2012-03-08 12:16:20

+0

@ user1254916:從URL的末尾刪除特定項目,只檢查路徑的最後一個元素,如果不需要,則將其設置爲空字符串。我修改了我的答案來證明。 – Borodin 2012-03-08 17:14:34