URI 的 Perl 条带正则表达式

Perl Strip Regex For URI

我正在尝试删除所有 https、http、www、/、: 和 .从域名中创建一个用户帐户文件夹在我的系统上。所以我需要做的是将一个看起来像这样的 URL“https://www.My-Domain.com/”变成 "My-Domaincom" 我很接近,但似乎无法让它工作。

our $DomainAccount = lc($ENV{HTTP_REFERER});
  $DomainAccount =~ s/^http:\/\/|^https:\/\///;
  $DomainAccount =~ s/^www\.|(/.)//;

您只需要确保您匹配 http://https://(可选地后跟 www.)、匹配 并捕获 主机 URL 部分到第一个 / 然后匹配其余部分,并替换为对第一个捕获组 </code> 的反向引用,并且为了从中删除 <code>. host.com 您需要像这样使用第二个捕获组:

$DomainAccount =~ s/^https?:\/\/(?:www\.)?([^\/.]+)\.([^\/.]+).*//i;

"https://www.My-Domain.com/" 的输出:My-Domaincom

参见regex demo here

注意我添加了一个不区分大小写的标志 /i 只是为了确保该模式也可以处理 HTTP:// 大小写。

正则表达式匹配:

  • ^ - 字符串开头
  • https?:\/\/ - 文字字符序列 http://https://
  • (?:www\.)? - 文字字符序列出现一次或零次 www.
  • ([^\/.]+) - 第 1 组:/.
  • 以外的一个或多个字符
  • \. - 文字点
  • ([^\/.]+) - 第 2 组:/.
  • 以外的一个或多个字符
  • .* - 该行的其余部分

为了解决 choroba 的评论,这里有一个两步解决方案,适用于在主机部分包含多个点的 URL:

$DomainAccount =~ s/^https?:\/\/(?:www\.)?([^\/]+).*//i;
$DomainAccount =~ s/\.//g;

URI可以帮到你,但是你还是得自己把www去掉:

#! /usr/bin/perl
use warnings;
use strict;

use URI;

my $url = 'URI'->new('https://www.My-Domain.com/');
my $account = $url->host;
$account =~ s/^[^.]*\.// while 1 != $account =~ tr/.//;
$account =~ s/\.//;
print $account, "\n";

这只会在结果中留下顶级和二级域名(尝试使用 http://some.very.long.domain.name.com)。