如何使用正则表达式从Perl中的URL获取主机名?

L0c*_*z0r -2 regex url perl host

所以我要做的是删除所有内容,包括第一个"/"后出现在"."之后.所以:http://linux.pacific.net.au/primary.xml.gz 将成为:http://linux.pacific.net.au

我如何使用正则表达式执行此操作?我正在运行的系统无法使用URI工具.

cdt*_*its 6

$url = 'http://linux.pacific.net.au/primary.xml.gz';
($domain) = $url =~ m!(https?://[^:/]+)!;
print $domain;
Run Code Online (Sandbox Code Playgroud)

输出:

http://linux.pacific.net.au
Run Code Online (Sandbox Code Playgroud)

这是官方正则表达式,可用于解码URI:

  my($scheme, $authority, $path, $query, $fragment) =
  $uri =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
Run Code Online (Sandbox Code Playgroud)


Bor*_*din 5

我建议你使用URI::Split它将标准URL分成你的constonnt部分并重新加入它们.你想要前两个部分 - 方案主机.

use strict;
use warnings;

use URI::Split qw/ uri_split uri_join /;

my $scheme_host = do {
  my (@parts) = uri_split 'http://linux.pacific.net.au/primary.xml.gz';
  uri_join @parts[0,1];
};

print $scheme_host;
Run Code Online (Sandbox Code Playgroud)

产量

http://linux.pacific.net.au
Run Code Online (Sandbox Code Playgroud)

更新

如果您的评论我正在运行的系统无法使用URI工具意味着您无法安装模块,那么这里是一个正则表达式解决方案.

你说你要删除所有内容,包括第一个"/"后出现在"."之后.,所以/^.*?\./找到第一个点,然后m|[^/]+|在下一个斜线后找到所有内容.

输出与前面的代码相同

use strict;
use warnings;

my $url = 'http://linux.pacific.net.au/primary.xml.gz';

my ($scheme_host) = $url =~ m|^( .*?\. [^/]+ )|x;

print $scheme_host;
Run Code Online (Sandbox Code Playgroud)