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

时间:2012-08-09 01:40:46

标签: regex perl url host

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

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

3 个答案:

答案 0 :(得分:6)

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

输出:

http://linux.pacific.net.au

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

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

答案 1 :(得分:5)

我建议您使用URI::Split,它会将标准网址分成适合您的常规部分并重新加入。您需要前两部分 - 计划主机

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;

<强>输出

http://linux.pacific.net.au

<强>更新

如果您的评论我正在运行的系统无法使用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;

答案 2 :(得分:4)

  

我正在运行的系统无法使用URI工具。

我真的建议你尽一切可能先解决这个问题。如果您无法使用CPAN模块,那么您将错失Perl的许多功能,并且您的Perl编程生命将比它需要的更令人沮丧。