我怎樣才能得到一部分的網址?Perl正則表達式來獲得一個URL的根域
例如:
http://www.facebook.com/xxxxxxxxxxx
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy
我需要把眼前這個部分:
facebook.com
stackoverflow.com
我怎樣才能得到一部分的網址?Perl正則表達式來獲得一個URL的根域
例如:
http://www.facebook.com/xxxxxxxxxxx
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy
我需要把眼前這個部分:
facebook.com
stackoverflow.com
只是一些簡單的正則表達式的東西。
$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/;
這是非常困難的**,以正確的單個正則表達式。你真的要小心。如果它是'http'或'https'協議怎麼辦?如果沒有'www.',怎麼辦?如果有像https://mobile.google.com/a/b這樣的網址,該怎麼辦?在正則表達式中檢查斜槓是貪婪的。你可以修復其中的一些問題,但你可能會被正則表達式咬傷。這是一個體面的答案,並解決了示例輸入的問題,但不是所有可能的URL ... – Jess 2013-03-26 02:32:04
未能通過http:// www.google.ca /'。無法訪問'http:// www.theregister.co.uk /' – ikegami 2013-03-26 02:33:40
我找到了一種方法:
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";
}
'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
(適用於https:// www.facebook.com /「HTTP:// www.facebook.com/」和「http:// www3.com /」)。基本設計缺陷阻止其他人修復。 ) – ikegami 2013-03-26 05:17:39
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
我們不知道OP是否想要子域或根域。答案應該是「mobile.google.com」還是「google.com」?問題並不清楚。 – Jess 2013-03-26 15:50:03
@Jessemon,是的,這還不清楚,但這是一個相當安全的賭注。 – ikegami 2013-03-26 19:54:36
如果你有以下形式的域:「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
我喜歡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
。
$a="http://www.stackoverflow.com/yyyyyyyyyyyyyyyy";
if($a=~/\/\/\w+\.(.*)\//)
{ print $1; }
else
{ print "false"; }
,這可能是有幫助的...
^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
請記住,您可以使用除斜槓外的其他字符來分隔正則表達式。例如,要將所有內容匹配到第一個斜槓:'$ url =〜m {。*?/}'。 – 2013-03-26 02:15:41
除非你真的需要正則表達式,否則你可以考慮ikegami的答案。 – Samiron 2013-04-20 20:24:55