2013-03-26 57 views
3

我怎樣才能得到一部分的網址?Perl正則表達式來獲得一個URL的根域

例如:

http://www.facebook.com/xxxxxxxxxxx 
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy 

我需要把眼前這個部分:

facebook.com 
stackoverflow.com 
+0

請記住,您可以使用除斜槓外的其他字符來分隔正則表達式。例如,要將所有內容匹配到第一個斜槓:'$ url =〜m {。*?/}'。 – 2013-03-26 02:15:41

+0

除非你真的需要正則表達式,否則你可以考慮ikegami的答案。 – Samiron 2013-04-20 20:24:55

回答

0

只是一些簡單的正則表達式的東西。

$facebook = "www.facebook.com/xxxxxxxxxxx"; 

$facebook =~ s/www\.(.*\.com).*/$1/; # get what is between www. and .com 

print $facebook; 

返回

facebook.com 

您可能還希望使這一工作.net.org等喜歡的東西:

s/www\.(.*\.(?:net|org|com)).*/$1/; 
+0

這是非常困難的**,以正確的單個正則表達式。你真的要小心。如果它是'http'或'https'協議怎麼辦?如果沒有'www.',怎麼辦?如果有像https://mobile.google.com/a/b這樣的網址,該怎麼辦?在正則表達式中檢查斜槓是貪婪的。你可以修復其中的一些問題,但你可能會被正則表達式咬傷。這是一個體面的答案,並解決了示例輸入的問題,但不是所有可能的URL ... – Jess 2013-03-26 02:32:04

+1

未能通過http:// www.google.ca /'。無法訪問'http:// www.theregister.co.uk /' – ikegami 2013-03-26 02:33:40

0

我找到了一種方法:

my @urls = qw(http://www.facebook.com http://www.sadas.com/); 
for my $url (@urls) { 
    $url =~ s/^https?:(?:www\.)?//ig; 
    $url =~ s{/.*}{}; 
    print "$url\n"; 
} 
+1

'http:// mobile.google.com /'怎麼辦? '的https:// www.facebook.com /'? 'HTTP:// www.facebook.com /'? 'HTTP:// www.com /'? 'HTTP:// www3.com /'? – ikegami 2013-03-26 02:40:19

+0

(適用於https:// www.facebook.com /「HTTP:// www.facebook.com/」和「http:// www3.com /」)。基本設計缺陷阻止其他人修復。 ) – ikegami 2013-03-26 05:17:39

10
use feature qw(say state); 

use Domain::PublicSuffix qw(); 
use URI     qw(); 

# Returns "domain.tld" for "subdomain.domain.tld". 
# Handles multi-level TLDs such as ".co.uk". 
sub root_domain { 
    my ($domain) = @_; 
    state $parser = Domain::PublicSuffix->new(); 
    return $parser->get_root_domain($domain); 
} 

# Accepts urls as strings and as URI objects. 
sub url_root_domain { 
    my ($abs_url) = @_; 
    my $domain = URI->new($abs_url)->host(); 
    return root_domain($domain); 
} 

say url_root_domain('http://www.facebook.com/');  # facebook.com 
say url_root_domain('https://www.facebook.com/');  # facebook.com 
say url_root_domain('http://mobile.google.com/');  # google.com 
say url_root_domain('http://www.theregister.co.uk/'); # theregister.co.uk 
say url_root_domain('http://www.com/');    # www.com 
+0

我們不知道OP是否想要子域或根域。答案應該是「mobile.google.com」還是「google.com」?問題並不清楚。 – Jess 2013-03-26 15:50:03

+0

@Jessemon,是的,這還不清楚,但這是一個相當安全的賭注。 – ikegami 2013-03-26 19:54:36

+0

如果你有以下形式的域:「subdomain.domain.tld」,你可以得到「domain.tld」: 'state $ parser = Domain :: PublicSuffix-> new(); $ parser-> get_root_domain($ subdomain_domain_tld);'(這是ikegami解釋的內容,但不需要解析URL)。謝謝ikegami。 – lepe 2015-07-21 09:48:26

2

我喜歡URI答案。 OP請求了一個正則表達式,所以爲了紀念這個請求並且作爲一個挑戰,這裏是我提出的答案。公平地說,有時安裝CPAN模塊並不容易或不可行。我曾參與過一些使用特定版本的Perl進行強化的項目,並且只允許某些模塊。

這是我在正則表達式答案的嘗試。請注意,www.是可選的。像mobile.這樣的子域名是榮幸的。 /的搜索不是貪婪的,因此一個包含目錄的URL將被正確解析。我不依賴於協議;無論如何它可能是http, https, file, sftp。輸出在$1中被捕獲。

^.*://(?:[wW]{3}\.)?([^:/]*).*$ 

樣品輸入:

http://WWW.facebook.com:80/ 
http://facebook.com/xxxxxxxxxxx/aaaaa 
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy/aaaaaaa 
https://mobile.yahoo.com/yyyyyyyyyyyyyyyy/aaaaaaa 
http://www.theregister.co.uk/ 

輸出示例:

facebook.com 
facebook.com 
stackoverflow.com 
mobile.yahoo.com 
theregister.co.uk 

編輯:感謝@ikegami了額外的挑戰。 :)現在它支持WWW在任何混合情況下和端口號如:80

+0

@ikegami,修正!任何其他失敗你可以看到? (除了子域和正則表達式開始變得醜陋的事實);) – Jess 2013-03-26 21:13:21

+1

只是'http:// www.com /',這可以被認爲是可以接受的丟失。 – ikegami 2013-03-27 03:29:46

0
$a="http://www.stackoverflow.com/yyyyyyyyyyyyyyyy"; 
if($a=~/\/\/\w+\.(.*)\//) 
{ print $1; } 
else 
{ print "false"; } 
2

,這可能是有幫助的...

^https?:\/\/www\.([\da-zA-Z\.-]+)

樣品輸入:

http://www.banglanews24.com/detailsnews.php 
nssl=763daee77dc90b1c1baf0a361be2ff3c&nttl=20130416072403189462 

http://www.prothom-alo.com/detail/date/2013-04-20/news/3463 

http://www.facebook.com/xxxxxxxxxxx 

http://www.stackoverflow.com/yyyyyyyyyyyyyyy 

輸出示例:

banglanews24.com 

prothom-alo.com 

facebook.com 

stackoverflow.com