Международные телефонные номера в современном веб-пространстве подчиняются стандарту E.164. Этот формат предполагает строгое структурирование строки номера: знак «+», код страны и национальный номер без пробелов, скобок и дополнительных разделителей. Максимальная длина ограничена 15 цифрами без учёта плюса.
При обработке пользовательских данных в JavaScript такие номера часто поступают в «грязном» виде: с пробелами, дефисами, скобками, внутренними разделителями, а также в локальных форматах, характерных для конкретной страны. Библиотека Validator.js предоставляет набор инструментов, позволяющих унифицировать и проверять такие строки без необходимости писать сложные регулярные выражения с нуля.
Основной метод, используемый для проверки номеров, —
isMobilePhone. Он предназначен для валидации мобильных
телефонов в зависимости от локали.
validator.isMobilePhone(str, locale, options)
str — проверяемая строкаlocale — регион или список регионовoptions — дополнительные параметры проверкиПример использования:
import validator from 'validator';
validator.isMobilePhone('+77011234567', 'kk-KZ');
В этом случае строка будет проверена в соответствии с правилами
Казахстана. Если формат соответствует допустимым маскам, функция
возвращает true.
Одной из ключевых особенностей Validator.js является поддержка множества локалей. Каждая страна или регион имеет собственные правила:
Примеры локалей:
validator.isMobilePhone('+79161234567', 'ru-RU');
validator.isMobilePhone('+14155552671', 'en-US');
validator.isMobilePhone('+447911123456', 'en-GB');
Также можно передавать массив локалей:
validator.isMobilePhone('+447911123456', ['en-GB', 'en-US']);
Это позволяет реализовать гибкую систему, где пользователь может вводить номер без строгой привязки к одной стране.
Validator.js допускает различные форматы строки, но проверка зависит от выбранной локали. Например, следующие варианты могут быть валидными:
+77011234567+7 701 123 45 67+7 (701) 123-45-67Однако важно учитывать, что библиотека не выполняет автоматическую нормализацию номера. Она проверяет строку «как есть». Поэтому предварительная очистка часто необходима.
Перед валидацией часто выполняется подготовка строки:
const raw = '+7 (701) 123-45-67';
const normalized = raw.replace(/[\s()-]/g, '');
После нормализации:
validator.isMobilePhone(normalized, 'ru-RU');
Такой подход снижает вероятность ошибок, связанных с форматированием пользовательского ввода.
Хотя Validator.js напрямую не ограничивает проверку только E.164, можно реализовать строгую валидацию через комбинацию методов.
E.164 предполагает:
Простейшая проверка через matches:
validator.matches(phone, /^\+[1-9]\d{1,14}$/);
Этот подход используется в случаях, когда требуется строгая стандартизация, например:
matches для кастомной логикиМетод matches позволяет реализовать более гибкие
правила, чем isMobilePhone.
validator.matches(phone, /^\+\d{10,15}$/);
Этот вариант не учитывает региональную специфику, но подходит для базовой фильтрации корректных международных номеров.
Расширенный вариант:
validator.matches(phone, /^\+[1-9]\d{1,3}\s?\d{4,14}$/);
Он допускает пробел после кода страны, что иногда встречается в пользовательских интерфейсах.
В некоторых случаях необходимо убедиться, что после удаления символов остаются только цифры:
const cleaned = phone.replace(/\+/g, '');
validator.isNumeric(cleaned);
Однако этот подход не учитывает корректность структуры номера и используется только как вспомогательная проверка.
Часто входящие данные содержат типичные ошибки:
++77011234567+7-701-123-45-67 ext 12Очистка может выглядеть следующим образом:
const sanitizePhone = (value) =>
value
.replace(/[^\d+]/g, '')
.replace(/(?!^)\+/g, '');
После этого значение становится пригодным для проверки через
isMobilePhone или регулярное выражение.
В разных странах структура мобильных номеров может существенно отличаться:
Validator.js учитывает эти особенности через внутренние маски. Однако важно понимать, что библиотека не является полноценным парсером телефонных номеров уровня libphonenumber и работает на основе предопределённых шаблонов.
В реальных приложениях часто используется комбинированный подход:
const isValidPhone = (value) => {
const normalized = value.replace(/[\s()-]/g, '');
return (
validator.matches(normalized, /^\+[1-9]\d{7,14}$/) &&
validator.isMobilePhone(normalized, 'any')
);
};
Такой подход позволяет:
Несмотря на удобство, библиотека имеет ряд ограничений:
В задачах, где требуется высокая точность (например, международные телекоммуникационные сервисы), Validator.js часто используется только как первый уровень фильтрации.
Валидация телефонных номеров обычно встроена в пользовательские формы:
if (!validator.isMobilePhone(inputValue, 'ru-RU')) {
throw new Error('Некорректный номер телефона');
}
При этом важно учитывать, что проверка должна выполняться не только на клиентской стороне, но и на сервере, чтобы исключить подмену данных.
Для последующей обработки номера обычно приводятся к единому виду:
const toE164 = (value) => value.replace(/[^\d+]/g, '');
Такой подход упрощает: