2013-03-26 93 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