Проверка и валидация URL с помощью регулярных выражений
Регулярное выражение — быстрый способ базовой валидации URL: проверяет схему (http/https), домен, TLD и путь. Это простой фильтр для пользовательских форм и быстрой предвалидации, но не заменяет полноценный парсер URL и не покрывает все допустимые случаи (IP, Punycode, редкие TLD, другие протоколы). В статье объяснено предложенное регулярное выражение, показаны примеры для Python и JavaScript, приведены ограничения и альтернативные подходы, а также чек-листы и набор тестов.

Программирование делает работу с текстовыми данными — структурированными и неструктурированными — гораздо проще. Инструменты вроде регулярных выражений и внешних библиотек упрощают задачу валидации URL. В этой статье показано простое регулярное выражение для проверки URL, объяснены его части и ограничения, а также приведены примеры использования в Python и JavaScript.
Важно: приведённое ниже регулярное выражение не покрывает все возможные, но редкие, варианты допустимых URL. Оно предназначено для простых сценариев и предвалидации.
Что делает это регулярное выражение
Регулярное выражение, используемое в примерах, считает URL корректным, если соблюдены следующие условия (упорядочено и пояснено кратко):
- Строка начинается с http или https, за которыми следует ://.
- Далее идёт допустимая комбинация символов для поддомена и корневого домена: буквы, цифры и набор специальных символов из разрешённого множества.
- Общая длина части «поддомен + домен» ограничена — в выражении используется граница 2–256 символов (эта граница — эмпирическая, для фильтрации слишком коротких/длинных вариантов).
- После доменной части должен идти точечный разделитель и TLD, состоящий только из букв и длиной 2–6 символов (в этом выражении ограничение 2–6).
- После TLD может идти путь, параметры или query-строка — набор допустимых символов повторяется ноль или более раз.
- Регулярное выражение проверяет всю строку от начала до конца, то есть ^…$.
Важно: реальные правила для TLD и длины домена шире, чем здесь. Многие современные TLD длиннее 6 символов (например, .technology), а сами домены могут содержать Unicode (Punycode) и IP-адреса как хосты. Если нужно покрыть все варианты, используйте парсер URL или специализированные библиотеки.
Регулярные выражения в примерах
Ниже — варианты регулярного выражения и их использование в коде.
JavaScript (регулярное выражение для простых случаев):
/^(http(s):\/\/.)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/Python (строка-паттерн для re):
r"^((http|https)://)[-a-zA-Z0-9@:%._\\+~#?&//=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)$"Пояснения к фрагментам паттерна (одно предложение на ключевой токен):
- (http|https):// — гарантирует схему http или https и обязательный разделитель ://.
- [-a-zA-Z0-9@:%._+~#?&//=] — разрешённые символы в поддомене/домене/пути; набор включает буквы, цифры и часто используемые символы URL.
- {2,256} — длина комбинированной части «поддомен + домен» (эмпирическое ограничение).
- \. — экранированная точка между доменом и TLD.
- [a-z]{2,6} — TLD только из букв, длина 2–6.
- \b — граница слова, помогает корректно отделять TLD.
- ([-…]* ) — остаток URL: путь, параметры, фрагменты; повторяется 0 или более раз.
- ^ и $ — начало и конец строки, проверка на полное соответствие.
Примеры URL, которые удовлетворяют этому паттерну
- https://www.something.com/
- http://www.something.com/
- https://www.something.edu.co.in
- http://www.url-with-path.com/path
- https://www.url-with-querystring.com/?url=has-querystring
- http://url-without-www-subdomain.com/
- https://mail.google.com
Примеры кода
Python: простой валидатор, использующий re
import re
def validate_url(url):
regex = r"^((http|https)://)[-a-zA-Z0-9@:%._\\+~#?&//=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)$"
pattern = re.compile(regex)
if re.search(pattern, url):
print('Valid')
else:
print('Not Valid')
# Примеры
validate_url('https://www.linkedin.com/')
validate_url('http://apple')
validate_url('iywegfuykegf')
validate_url('https://w')JavaScript: функция для проверки
function validateURL(url) {
var re = /^(http(s):\/\/.)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/g;
if (re.test(url)) {
console.log('Valid');
} else {
console.log('Not Valid');
}
}
validateURL('https://www.linkedin.com/');
validateURL('http://apple');
validateURL('iywegfuykegf');
validateURL('https://w');Где это удобно использовать
- Валидация полей формы (контактные формы, профиль пользователя) — быстрая предвалидация на клиенте и/или сервере.
- Фильтрация и извлечение ссылок из текста для дальнейшей обработки.
- Предварительная проверка ссылок перед асинхронной валидацией/проверкой доступности.
Когда регулярное выражение не подходит — типичные ограничения
- IP-адреса в хосте (например, http://127.0.0.1) могут не пройти — паттерн ориентирован на доменные имена.
- Международные домены (IDN / Punycode) и Unicode-символы в домене/пути не покрываются.
- Некоторые новые или длинные TLD превосходят ограничение {2,6}.
- Протоколы, отличные от http/https (ftp, ws, mailto и т. п.), не будут признаны корректными.
- Сложные или особые схемы авторизации, нестандартные порты и нетипичные символы в URL могут вызвать ложные срабатывания.
Альтернативные подходы (рекомендуется для продакшена)
- Использовать встроенные парсеры URL:
- В JavaScript: конструктор URL (new URL(value)) — он корректно разбирает большинство случаев и бросает исключение для некорректных строк.
- В Python: urllib.parse.urlparse и последующая валидация полей.
- Пользоваться проверенными библиотеками валидации URL:
- На Python: validators, rfc3986 и другие.
- На JavaScript/Node.js: validator.js или WHATWG URL.
- Приём: комбинировать быструю регексп-предвалидацию с последующей строгой серверной проверкой через парсер.
Мини‑методология: как выбрать стратегию валидации URL
- Определите требования: принимаете ли вы только http/https, нужна ли поддержка IDN, дозволены ли IP в хосте.
- Для простых входных форм применяйте короткую регексп-предвалидацию на клиенте (UX).
- На сервере используйте строгий парсер и дополнительные проверки (разрешённые домены, проверка доступности, допустимые протоколы).
- Логируйте отклонённые URL и случаи false-negative, чтобы корректировать паттерн или правила.
Контроль качества: тесты и критерии приёмки
Критерии приёмки
- Функция возвращает ‘Valid’ для всех базовых корректных URL из списка требований.
- Функция возвращает ‘Not Valid’ для строк без схемы или без корректного домена.
- Документирован список известных ограничений (IP, IDN, нестандартные TLD).
- Сценарий для регрессионных тестов присутствует в CI.
Минимальные тест-кейсы
- Корректные: https://www.example.com/, http://example.org, https://sub.domain.co.uk/path?x=1#frag
- Некорректные: https://, http://apple, plainstring, https://w, user@host
- Граничные: длинные домены, домены с дефисами, query-параметры со спецсимволами
Практическое руководство для ролей
Developer
- Использовать регексп для быстрой валидации на клиенте.
- Валидация на сервере — через парсер/библиотеку.
- Логирование и метрики по отклонённым URL.
QA
- Подготовить набор тестовых URL (валидные/невалидные/граничные).
- Проверить поведение на разных локалях и кодировках.
Security
- Убедиться, что валидация не позволяет SSRF/инъекции (например, разрешать только белый список доменов для внутренних операций).
- Проверять и нормализовать вход перед последующим использованием.
Быстрый лист (cheat sheet)
- Если нужен простой фильтр — используйте предложенный regex.
- Для надёжной валидации — используйте парсер URL (new URL в браузере или urllib.parse в Python).
- Всегда проверяйте на стороне сервера.
Примеры отказа: когда нужно изменить стратегию
- Приложение принимает ссылки из разных стран — требуется поддержка IDN.
- Система должна обрабатывать FTP/MAILTO/WS — нужно расширить паттерн или применять парсер.
- Требуется проверять принадлежность домена конкретной организации — регексп недостаточен, нужна проверка DNS/WHOIS/списки.
Резюме
Регулярное выражение — удобный инструмент для быстрой предвалидации URL в простых сценариях. Оно помогает отсеивать явно неверные строки до более дорогой серверной проверки. Однако для надёжной и полной валидации в продакшене предпочтительнее использовать парсер URL или проверенные библиотеки: они корректнее обрабатывают IP-хосты, IDN, редкие TLD и особенности протоколов.
Ключевые рекомендации:
- Используйте регексп для UX (клиентская предвалидация).
- Всегда подтверждайте входные данные на сервере с помощью парсера.
- Документируйте ограничения паттерна и добавляйте тесты для граничных случаев.
Краткое примечание: если ваша задача — строгая совместимость с RFC 3986 и современными IDN/TLD, доверьте валидацию специализированным библиотекам, а регулярные выражения применяйте лишь для быстрых проверок.
Похожие материалы
Как устроить идеальную вечеринку для просмотра ТВ
Как распаковать несколько RAR‑файлов сразу
Приватный просмотр в Linux: как и зачем
Windows 11 не видит iPod — способы исправить
PS5: как настроить игровые пресеты