Замудрёным регекспом?

Задача: из имени домена вида part1.part2.part3.part4 получить домен вида part2.part3.part4 используя capture groups

part1 и part2 могут отсутствовать

если part2 нет (домен второго уровня), то получить домен www.part3.part4


В итоге должно работать так:
www.subdomain.domain.ru -> subdomain.domain.ru

subdomain.domain.ru -> subdomain.domain.ru
www.domain.ru -> www.domain.ru

domain.ru -> www.domain.ru


Использование capture groups принципиально.


Возможно ли решить задачу в рамках PCRE?


Вопрос также можно сформулировать в виде: как в PCRE задать значение для capture group, если она выглядит как (.+)? и не сматчилась.
  • Вопрос задан
  • 3339 просмотров
Пригласить эксперта
Ответы на вопрос 4
@noonesshadow
server_name "~^(?\w+\.)?(?\w+\.)?(?\w+\.)(?\w+)$"
if ($part2 = "") {$part2 = «www»;}
return 301 http://$part2$part3$part4
Ответ написан
kentilini
@kentilini
В продакшн
server_name s"~^(?\w+\.)?(?\w+\.)?(?\w+\.)(?\w+)$«htttp://(?($part2)www|)$part3$part4»g

Конечно, если язык поддерживает конструкцию (?(n)то|иначе). Такую конструкцию можно написать с помощью ретроспективных проверок.

P.S.
Не вините за синтаксис, точных правил не знаю
Ответ написан
kentilini
@kentilini
В продакшн
Но на вашем месте я бы просто приписал бы 'www.' слева и воспользовался бы просто регуляркой в духе
$_ = «www.» + serverName;
s/^(?:\w+\.){0,2}(\w+\.\w+\.\w+)$/$1/g
Ответ написан
Комментировать
vsespb
@vsespb
PCRE, не смотря на то, что расшифровывается как Perl Compatible Regular Expressions, не имеет отношения к Perl. В Perl регэкспы другие. PCRE просто старается сделать их похожими.

(это я к вопросу названия хаба)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы