Perl Regex获取URL的根域
如何获取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
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,修好了!你还能看到其他的失败吗?(除了子域和正则表达式开始变得丑陋这一事实之外)