2016-02-17 3 views
1

Я пытаюсь удалить все https, http, www, /,: и. из имени домена, чтобы создать папку учетной записи пользователя в моей системе. Так что мне нужно сделать URL-адрес, который выглядит так: «https://www.My-Domain.com/» в «My-Domaincom». Я рядом, но просто не могу заставить его работать.Perl Strip Regex для URI

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

Возможно, '$ DomainAccount = ~ s/^ https?: \/\/(?: www \.)? // i;'? –

+0

Нет, я до сих пор в конечном итоге: My-Domain.com/ – Blnukem

+0

Ага, вам нужно перейти к первому '/', использовать '$ DomainAccount = ~ s/^ https?: \/\/(?: www \.)? ([^ \ /] +). */$ 1/i; ' –

ответ

1

Вам просто нужно, чтобы убедиться, что вы подходите http:// или https://, которые необязательно следуют с www., матч и захватить на хост URL часть до первого /, а затем сопоставить остальные, и заменить на обратная ссылка к первой группе захвата $1, и для того, чтобы удалить . из host.com вам нужно использовать вторую группу захвата, как это:

$DomainAccount =~ s/^https?:\/\/(?:www\.)?([^\/.]+)\.([^\/.]+).*/$1$2/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\.)?([^\/]+).*/$1/i; 
$DomainAccount =~ s/\.//g; 
+0

См. [Regex demo] (https://regex101.com/r/pQ6qH6/1) –

+0

Обратите внимание, что это работает только для трех доменных URL. – choroba

+0

Да, в качестве примера в вопросе. Я добавил двухэтапное решение для решения таких ситуаций. См. Это [IDEONE demo] (http://ideone.com/omKTeR). –

1

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).

+0

Это может быть сделано только с одной заменой регулярного выражения. –

+0

@ WiktorStribiżew: Мне труднее читать. – choroba

+0

Надеюсь, что объяснение в регулярном выражении упростит понимание. Нет ничего сложного, на самом деле, никаких обращений, никаких операторов '\ G' или' \ K', без рекурсии, просто классов символов, группировки, якорей и кванторов. Просто стандартный набор регулярных выражений. Ваше предложение тоже очень хорошее, +1. –

Смежные вопросы