Регулярные выражения для проверки email, URL и номера телефона
Регулярные выражения для валидации копируют чаще любых других, и многие из них содержат незаметные ошибки. Ниже шаблоны, которые работают в реальных формах, пояснение к каждой части и случаи, когда регулярное выражение — неподходящий инструмент.
Проверяйте мягко, подтверждайте по-настоящему
Регулярное выражение может показать, что введённая строка похожа на адрес электронной почты, но реально существование адреса подтверждает только отправленное письмо. Строгие шаблоны отсекают настоящих пользователей — знаки плюс, длинные домены, международные имена, — при этом пропускают опечатки. Цель — шаблоны, которые ловят очевидные ошибки, а затем проверка.
Адреса электронной почты
Практичный шаблон, который подходит почти для всех реальных адресов:
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Что-то, затем @, домен с точкой и без пробелов. Он принимает ada+news@example.co.uk и отклоняет ada@example и ada @example.com. Чуть более строгий вариант для локальной части:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Этот вариант отклоняет интернационализированные адреса (например, josé@example.com), поэтому если ваши пользователи по всему миру, выбирайте первый. В HTML <input type="email"> уже проверяет адрес встроенным правилом браузера. Чтобы убедиться, что домен может принимать почту, проверьте его MX-запись с помощью Email DNS Checker.
URL
Не пишите регулярное выражение для URL — разбирайте его парсером. В каждой современной среде выполнения есть парсер URL, который знает все правила:
function isHttpUrl(value) {
try {
const u = new URL(value);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch {
return false;
}
}
Проверка протокола важна: new URL('javascript:alert(1)') разбирается без ошибок, но такая строка никогда не должна попадать в href. Если нужно регулярное выражение, чтобы найти URL в тексте, используйте простое и разбирайте каждое совпадение потом:
https?:\/\/[^\s<>"']+
Разбить URL на протокол, хост, путь и параметры запроса поможет URL Parser.
Телефонные номера
Форматы телефонов различаются по странам, поэтому самое надёжное регулярное выражение только очищает ввод. Удалите всё, кроме цифр и ведущего плюса, затем проверьте длину по стандарту E.164 (до 15 цифр):
const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);
Для настоящей проверки по странам — коды регионов, мобильные и стационарные номера — используйте библиотеку, например libphonenumber. Если вы принимаете только номера Северной Америки, подойдёт такой шаблон:
^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$
Проверьте перед запуском
Вставьте шаблон в Regex Tester вместе со списком корректных и некорректных примеров, по одному в строке, и включите флаг multiline, чтобы ^ и $ совпадали с каждой строкой. Если унаследованный шаблон нечитаем, Regex Explainer разберёт его по токенам. Остерегайтесь катастрофического бэктрекинга: вложенные квантификаторы вроде (a+)+ могут заблокировать сервер на специально подобранной строке.