我怎样才能得到一部分的网址?Perl正则表达式来获得一个URL的根域
例如:
http://www.facebook.com/xxxxxxxxxxx
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy
我需要把眼前这个部分:
facebook.com
stackoverflow.com
我怎样才能得到一部分的网址?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 is between www. and .com
print $facebook;
返回
facebook.com
您可能还希望使这一工作.net
,.org
等喜欢的东西:
s/www\.(.*\.(?:net|org|com)).*/$1/;
这是非常困难的**,以正确的单个正则表达式。你真的要小心。如果它是'http'或'https'协议怎么办?如果没有'www.',怎么办?如果有像https://mobile.google.com/a/b这样的网址,该怎么办?在正则表达式中检查斜杠是贪婪的。你可以修复其中的一些问题,但你可能会被正则表达式咬伤。这是一个体面的答案,并解决了示例输入的问题,但不是所有可能的URL ... – Jess 2013-03-26 02:32:04
未能通过http:// www.google.ca /'。无法访问'http:// www.theregister.co.uk /' – ikegami 2013-03-26 02:33:40
我找到了一种方法:
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";
}
'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
(适用于https:// www.facebook.com /“HTTP:// www.facebook.com/”和“http:// www3.com /”)。基本设计缺陷阻止其他人修复。 ) – ikegami 2013-03-26 05:17:39
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
我们不知道OP是否想要子域或根域。答案应该是“mobile.google.com”还是“google.com”?问题并不清楚。 – Jess 2013-03-26 15:50:03
@Jessemon,是的,这还不清楚,但这是一个相当安全的赌注。 – ikegami 2013-03-26 19:54:36
如果你有以下形式的域:“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
我喜欢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
。
$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
请记住,您可以使用除斜杠外的其他字符来分隔正则表达式。例如,要将所有内容匹配到第一个斜杠:'$ url =〜m {。*?/}'。 – 2013-03-26 02:15:41
除非你真的需要正则表达式,否则你可以考虑ikegami的答案。 – Samiron 2013-04-20 20:24:55