どうすればURLの一部を取得できますか?
例えば:
http://www.facebook.com/xxxxxxxxxxx
http://www.stackoverflow.com/yyyyyyyyyyyyyyyy
私はこの部分だけを取る必要があります:
facebook.com
stackoverflow.com
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
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
。
これは役に立つかもしれません...
^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
私は方法を発見しました:
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";
}
$a="http://www.stackoverflow.com/yyyyyyyyyyyyyyyy";
if($a=~/\/\/\w+\.(.*)\// )
{ print $1; }
else
{ print "false"; }
いくつかの単純な正規表現のもの。
$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/;