Perl Regex获取URL的根域

Perl Regex获取URL的根域,regex,perl,Regex,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 i

如何获取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/;
我找到了一个方法:

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";
}

我喜欢这个答案。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
样本输出:

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{.*?/}
。除非您真的需要正则表达式,否则您可以考虑ikegami的答案。使用单个正则表达式很难做到这一点。你真的必须小心。如果是
http
https
协议呢。如果没有
www.
怎么办。如果有一个类似的URL,该怎么办。正则表达式中斜杠的检查是贪婪的。您可以解决其中一些问题,但您可能会被正则表达式咬到。这是一个不错的答案,解决了示例输入的问题,但不是所有可能的URL…关于
http://mobile.google.com/
<代码>https://www.facebook.com/<代码>HTTP://www.facebook.com/<代码>http://www.com/<代码>http://www3.com/?(适用于
https://www.facebook.com/
HTTP://www.facebook.com/
http://www3.com/
现在。基本的设计缺陷阻止了其他方面的修复。)我们不知道OP想要子域还是根域。答案应该是
mobile.google.com
还是
google.com
?问题中不清楚。如果域的形式为:“subdomain.domain.tld”,则可以通过以下方式获得“domain.tld”:
state$parser=domain::PublicSuffix->new()$解析器->获取根域($subdomain\u domain\u tld)(ikegami解释了这一点,但不需要解析URL)。谢谢ikegami。@ikegami,修好了!你还能看到其他的失败吗?(除了子域和正则表达式开始变得丑陋这一事实之外)