Заменить этот бит:
(?P<extension>\w+)
На:
(?P<extension>\w+(?:\.\w+)?)
Где (?:
... )
часть - группа без захвата, с ?
сделать его необязательным.
Вероятно, я бы пошел еще дальше и изменил бы этот бит следующим образом:
(?P<extension>[a-z]{2,10}(?:\.[a-z]{2,10})?)
Поскольку расширение не содержит цифр или подчеркиваний, а обычно состоит из 2/3 букв (я думаю, что .museum самый длинный, при 6 ... так что 10, вероятно, является безопасным максимумом).
Если вы сделаете это, вы можете захотеть добавить флаг без учета регистра (или также ввести AZ).
Исходя из вашего комментария, вы хотите сделать субдомен частью совпадения «ленивым» (сопоставлять только в случае необходимости) и, таким образом, разрешить расширению захватывать обе части.
Для этого просто добавьте?
до конца квантифера, изменяя:
(?P<subdomain>[-\w\.]+)
на
(?P<subdomain>[-\w\.]+?)
И (теоретически - PHP не пригоден для тестирования), который только сделаетсубдомен длиннее, если это необходимо, поэтому следует позволить группе расширений соответствовать соответствующим образом.
Обновление:
Хорошо, если вы уже извлекли полное имя хоста (используя parse_url, как предложено в других комментариях Q /), попробуйте это для сопоставления частей субдомена, домена и расширения:
^(?P<subdomains>(?:[\w-]+\.)*?)(?P<domain>[\w-]+(?P<extension>(?:\.[a-z]{2,10}){1,2}))$
Это оставит .
в конце субдомена (и в начале extensio) n, но вы можете использовать substr($string,0,-1)
или аналогичный для его удаления.
Расширенная форма для удобства чтения:
^
(?P<subdomains>
(?:[\w-]+\.)*?
)
(?P<domain>
[\w-]+
(?P<extension>
(?:\.[a-z]{2,10}){1,2}
)
)$
(можете добавить комментарии, чтобы объяснить что-либо из этого, если необходимо?)