URI的Perl Strip Regex

URI的Perl Strip Regex,regex,perl,cgi,Regex,Perl,Cgi,我试图去掉所有的https、http、www、/、:和。在我的系统上创建一个用户帐户文件夹。所以我需要做的是把一个像这样的URL放到“我的域名”中,我很接近,但似乎无法让它工作 our $DomainAccount = lc($ENV{HTTP_REFERER}); $DomainAccount =~ s/^http:\/\/|^https:\/\///; $DomainAccount =~ s/^www\.|(/.)//; 您只需确保与http://或https://匹配,然后将主机

我试图去掉所有的https、http、www、/、:和。在我的系统上创建一个用户帐户文件夹。所以我需要做的是把一个像这样的URL放到“我的域名”中,我很接近,但似乎无法让它工作

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

您只需确保与
http://
https://
匹配,然后将主机URL部分匹配并捕获到第一个
/
,然后匹配其余部分,并替换为对第一个捕获组
$1
的反向引用,要从
host.com
中删除
,您需要使用第二个捕获组,如下所示:

$DomainAccount =~ s/^https?:\/\/(?:www\.)?([^\/.]+)\.([^\/.]+).*/$1$2/i;
的输出https://www.My-Domain.com/“
我的域名com

请参阅

注意,我添加了一个不区分大小写的标志
/I
,以确保模式也可以处理
HTTP://
大小写

正则表达式匹配:

  • ^
    -字符串的开头
  • https?:\/\/
    -文字字符序列
    http://
    https://
  • (?:www\)?
    -文字字符序列出现一次或零次
    www.
  • ([^\/.]+)
    -第1组:除
    /
    之外的一个或多个字符
  • \。
    -文字点
  • ([^\/.]+)
    -第2组:除
    /
    之外的一个或多个字符
  • *
    -行的其余部分
为了解决choroba的评论,这里提供了一个两步解决方案,可用于主机部分中包含多个点的URL:

$DomainAccount =~ s/^https?:\/\/(?:www\.)?([^\/]+).*/$1/i;
$DomainAccount =~ s/\.//g;
可以帮助您,但您仍然需要自己删除
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
)。

也许
$domaincount=~s/^https?:\/\/(?:www\)?//i?不,我仍然会得到:My-Domain.com/Aha,你需要进入第一个
/
,使用
$domaincount=~s/^https?:\/\/(?:www\)([^\/]+)./$1/I
Nope让我明白了这一点:在void上下文中无用地使用非破坏性替换(s///r)。我更新了我的评论,查看我的答案(我在测试中使用了
/r
)。我希望我的regex解释更容易理解。实际上,没有什么困难,没有lookarounds,没有
\G
\K
运算符,没有递归,只有普通字符类、分组、锚和量词。只有标准的正则表达式工具包。你的建议也很好,是的,就像问题中的例子一样。我添加了一个两步解决方案来解决这种情况。看这个。