Ваше регулярное выражение в настоящее время допускает использование символа _
и запрещает использование символа -
, что означает, что он принимает недействительные URL-адреса. Вы можете исправить это с помощью следующей группы:
$pattern = '/[a-z0-9-]+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
Обратите внимание, что с этим все еще есть проблемы. Во-первых, доменные имена не могут начинаться или заканчиваться дефисом. Во-вторых, в настоящее время вы разрешаете ввод любых символов в ДВУ, тогда как они содержат только буквы.
Лучшее решение - использовать правильную библиотеку парсинга URL, а не пытаться делать это самостоятельно.