Телефонные коды стран

Телефонные коды стран представляют собой числовые префиксы, используемые для маршрутизации международных звонков. Они входят в структуру глобального телефонного номера, определённого стандартом E.164, где каждый номер начинается с символа «+», за которым следует код страны и национальный номер абонента.

Ключевая сложность при работе с телефонными кодами заключается в их неоднородности: длина кода может варьироваться от одной до трёх цифр, а последующая часть номера зависит от национального плана нумерации. Это создаёт дополнительные требования к валидации при разработке веб-приложений.


Структура международного телефонного номера

Стандарт E.164 задаёт единый формат:

+<код страны><национальный номер>

Примеры:

  • +7 — Казахстан, Россия
  • +49 — Германия
  • +1 — США, Канада и часть стран Карибского бассейна
  • +44 — Великобритания

Важно учитывать, что сам по себе код страны не определяет полный формат номера. Например, +1 используется сразу несколькими странами, а различия проявляются только в последующих цифрах.


Ограничения базовой валидации в Validator.js

Библиотека Validator.js предоставляет набор функций для проверки строковых значений, однако она не является специализированным инструментом для полноценного разбора телефонных номеров. Основные ограничения:

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

Тем не менее, Validator.js может быть эффективно использован как часть системы валидации.


Использование isMobilePhone для базовой проверки

Функция isMobilePhone позволяет проверять номера телефонов в зависимости от локали:

const validator = require('validator');

validator.isMobilePhone('+77011234567', 'kk-KZ'); // true
validator.isMobilePhone('+4915112345678', 'de-DE'); // true

Особенности:

  • требуется указание локали;
  • проверяется общий формат номера;
  • не гарантируется корректность кода страны вне выбранной локали.

Проверка наличия кода страны

Для первичной проверки можно использовать регулярные выражения совместно с Validator.js:

const validator = require('validator');

function hasValidCountryCode(phone) {
  if (!validator.isString(phone)) return false;

  // Проверка формата + и 1–3 цифры кода страны
  return /^\+\d{1,3}/.test(phone);
}

Данный подход проверяет только структуру префикса, но не его существование в реальном списке стран.


Нормализация телефонных номеров

Перед валидацией номера часто требуется очистка строки:

function normalizePhone(phone) {
  return phone.replace(/[\s()-]/g, '');
}

Примеры преобразования:

  • +7 (701) 123-45-67+77011234567
  • +49 151 123 4567+491511234567

После нормализации Validator.js работает более предсказуемо.


Проверка международного формата E.164

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

function isE164(phone) {
  return /^\+[1-9]\d{1,14}$/.test(phone);
}

Особенности стандарта:

  • максимум 15 цифр после «+»;
  • не допускаются ведущие нули;
  • код страны всегда начинается с ненулевой цифры.

Связь телефонных кодов и локалей Validator.js

Validator.js использует локали для определения допустимых форматов, например:

  • ru-RU
  • kk-KZ
  • de-DE
  • en-US

Однако локаль не равна телефонному коду страны. Например:

  • ru-RU может включать номера с кодом +7;
  • kk-KZ также использует +7;
  • en-US работает с кодом +1.

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


Построение собственной системы проверки кодов стран

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

const countryDialCodes = {
  KZ: '+7',
  RU: '+7',
  DE: '+49',
  US: '+1',
  GB: '+44'
};

function validateCountryCode(phone, country) {
  const code = countryDialCodes[country];
  if (!code) return false;

  return phone.startsWith(code);
}

Данный подход позволяет:

  • ограничить допустимые коды;
  • связать номер с конкретной страной;
  • комбинировать с Validator.js для общей проверки формата.

Комбинированная стратегия валидации

Практическая схема часто включает несколько уровней:

const validator = require('validator');

function validatePhone(phone, locale) {
  const normalized = phone.replace(/[\s()-]/g, '');

  if (!validator.isMobilePhone(normalized, locale)) {
    return false;
  }

  if (!/^\+\d{1,3}\d{4,14}$/.test(normalized)) {
    return false;
  }

  return true;
}

Такой подход объединяет:

  • проверку формата Validator.js;
  • контроль международного стандарта;
  • предварительную очистку строки.

Типичные ошибки при работе с кодами стран

При реализации валидации телефонных номеров часто встречаются следующие проблемы:

  • использование локали как единственного источника истины;
  • игнорирование пересечений кодов (+1, +7);
  • отсутствие нормализации ввода;
  • попытка валидировать номер без учета международного формата;
  • избыточная доверенность регулярным выражениям без контекстной проверки.

Обработка пограничных случаев

Некоторые номера требуют особого подхода:

  • служебные короткие номера (не соответствуют E.164);
  • номера с добавочными кодами (extension);
  • виртуальные номера VoIP;
  • региональные исключения внутри одного кода страны.

Пример удаления добавочного номера:

function stripExtension(phone) {
  return phone.split('x')[0];
}

Расширение функциональности Validator.js

Validator.js позволяет создавать пользовательские валидаторы:

validator.extend('isInternationalPhone', function (value) {
  return /^\+\d{7,15}$/.test(value);
});

Такой подход используется для:

  • стандартизации проверки внутри проекта;
  • сокращения дублирования кода;
  • интеграции бизнес-логики поверх базовой библиотеки.

Итоговая модель проверки телефонных кодов

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

  1. очистка входных данных;
  2. проверка международного формата;
  3. использование isMobilePhone для локали;
  4. проверка кода страны по справочнику;
  5. дополнительная бизнес-валидация.

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