Телефонные коды стран представляют собой числовые префиксы, используемые для маршрутизации международных звонков. Они входят в структуру глобального телефонного номера, определённого стандартом E.164, где каждый номер начинается с символа «+», за которым следует код страны и национальный номер абонента.
Ключевая сложность при работе с телефонными кодами заключается в их неоднородности: длина кода может варьироваться от одной до трёх цифр, а последующая часть номера зависит от национального плана нумерации. Это создаёт дополнительные требования к валидации при разработке веб-приложений.
Стандарт E.164 задаёт единый формат:
+<код страны><национальный номер>
Примеры:
Важно учитывать, что сам по себе код страны не определяет полный формат номера. Например, +1 используется сразу несколькими странами, а различия проявляются только в последующих цифрах.
Библиотека 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 работает более предсказуемо.
Validator.js содержит функцию isMobilePhone, но для
строгой проверки E.164 часто используется комбинированный подход:
function isE164(phone) {
return /^\+[1-9]\d{1,14}$/.test(phone);
}
Особенности стандарта:
Validator.js использует локали для определения допустимых форматов, например:
ru-RUkk-KZde-DEen-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);
}
Данный подход позволяет:
Практическая схема часто включает несколько уровней:
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;
}
Такой подход объединяет:
При реализации валидации телефонных номеров часто встречаются следующие проблемы:
Некоторые номера требуют особого подхода:
Пример удаления добавочного номера:
function stripExtension(phone) {
return phone.split('x')[0];
}
Validator.js позволяет создавать пользовательские валидаторы:
validator.extend('isInternationalPhone', function (value) {
return /^\+\d{7,15}$/.test(value);
});
Такой подход используется для:
Системная проверка обычно включает следующие уровни:
isMobilePhone для локали;Такой многоуровневый подход компенсирует ограничения Validator.js и позволяет корректно обрабатывать телефонные коды стран в реальных прикладных системах.