2011-07-29 49 views
0

我工作的一個程序,並需要從URL匹配從URL

如提取TLD和網頁推廣的TLD和文件擴展名:http://www.example.com/somedir/someotherdir/index.html應該給我TLD .com和擴展Html

雖然這個:http://www.example.com.au/somedir/someotherdir/index/應該給我TLD .com.au和擴展null

有沒有什麼辦法可以用Perl中的正則表達式?我在Perl中使用URI模塊,但它似乎無法執行此類型的提取。

回答

3

如果您使用的是URI模塊,則可以輕鬆提取hostpath。然後把最後一個點之後的所有東西都取出來,或者反過來把所有東西都去掉,包括最後一個點。您可能想要爲擴展程序更加複雜,以正確處理沒有擴展名的情況。

($tld = $uri->host) =~ s/.*\.//; 

($extension = $uri->path) =~ s/.*\///; 
$extension = '' unless $extension =~ s/.*\.//; 
+0

使用另一個分隔符爲'///'使其更具可讀性。例如''{。* /} {}'。 – TLP

+1

+1這是更好的解決方案,我刪除了我自己的帖子。輕微優化:'$ extension =($ uri-> path_segments)[ - 1]'將提取路徑的最後一個元素。 – TLP

+0

感謝您的評論,但我該如何處理諸如「http://www.example.com.au/」等根本頂級域名將包含com和au的案例。獲取最後一部分是我的主要挑戰 – damola

0

RFC-3986 Appendix B提供的正則表達式可以被修改以完成該任務:

if ($urltext =~ m! 
    ^    # Anchor to start of string. 
    (?:[^:/?#\s]+:)? # Optional URI scheme. 
    //[^:/?#\s]+\. # Required (non-IP) host (up to TLD) 
    ([^:/?#\s.\d]+) # $1: Top level domain(TLD) 
    (?::\d+)?   # Optional port. 
    /    # Required path separator. 
    [^?#\s]*\.  # Path up to file extension. 
    ([^?#\s.]+)  # $2: File extension. 
    (?:\?[^#\s]*)? # Optional query. 
    (?:\#\S*)?  # Optional fragment. 
    $     # Anchor to end of string. 
    !x) { 
    $tld = $1; 
    $ext = $2; 
} else { 
    # no match 
} 

(注意:它出現在SO語法熒光筆不能處理的Perl 'x' 的正則表達式模式)