4

我怎么能得到网址的一部分?

例如:

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

我只需要这一部分:

facebook.com
stackoverflow.com
4

6 回答 6

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
于 2013-03-26T02:37:40.400 回答
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
于 2013-04-20T17:55:56.470 回答
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.

于 2013-03-26T15:19:20.760 回答
0
$a="http://www.stackoverflow.com/yyyyyyyyyyyyyyyy";
if($a=~/\/\/\w+\.(.*)\// )
{   print $1; }
else
{ print "false";  }
于 2013-04-01T05:47:36.910 回答
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";
}
于 2013-03-26T02:08:30.607 回答
-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/;
于 2013-03-26T01:54:16.820 回答