Perl Regex获取URL的根域

时间:2013-03-26 01:43:14

标签: regex perl

我怎样才能获得网址的某些部分?

例如:

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

我需要采取这一部分:

facebook.com
stackoverflow.com

6 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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等端口号。

答案 2 :(得分: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

答案 3 :(得分: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";
}

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

只是一些简单的正则表达式。

$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/;