Проверка международных номеров

Международные телефонные номера в современном веб-пространстве подчиняются стандарту 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');

Такой подход снижает вероятность ошибок, связанных с форматированием пользовательского ввода.


Проверка по стандарту E.164

Хотя Validator.js напрямую не ограничивает проверку только E.164, можно реализовать строгую валидацию через комбинацию методов.

E.164 предполагает:

  • обязательный знак +
  • код страны (1–3 цифры)
  • общий лимит длины
  • отсутствие разделителей

Простейшая проверка через matches:

validator.matches(phone, /^\+[1-9]\d{1,14}$/);

Этот подход используется в случаях, когда требуется строгая стандартизация, например:

  • международные CRM-системы
  • банковские сервисы
  • API авторизации

Использование 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 при работе с телефонами

Несмотря на удобство, библиотека имеет ряд ограничений:

  • отсутствие полноценного разбора структуры номера
  • ограниченная точность по сравнению с специализированными библиотеками
  • зависимость от актуальности встроенных масок
  • невозможность определения оператора или типа линии на глубоком уровне

В задачах, где требуется высокая точность (например, международные телекоммуникационные сервисы), Validator.js часто используется только как первый уровень фильтрации.


Практика использования в формах ввода

Валидация телефонных номеров обычно встроена в пользовательские формы:

if (!validator.isMobilePhone(inputValue, 'ru-RU')) {
  throw new Error('Некорректный номер телефона');
}

При этом важно учитывать, что проверка должна выполняться не только на клиентской стороне, но и на сервере, чтобы исключить подмену данных.


Подход к хранению номеров

Для последующей обработки номера обычно приводятся к единому виду:

  • формат E.164
  • удаление всех разделителей
  • сохранение только цифр и знака +
const toE164 = (value) => value.replace(/[^\d+]/g, '');

Такой подход упрощает:

  • поиск по базе данных
  • дедупликацию
  • интеграцию с внешними API
  • отправку SMS и звонков