ISO 3166 является основой для большинства механизмов работы с кодами стран и регионов в веб-приложениях. Валидация таких значений в JavaScript чаще всего выполняется с помощью библиотеки Validator.js, которая предоставляет набор специализированных функций для проверки корректности международных идентификаторов стран, регионов и территорий.
Валидация кодов стран необходима при работе с адресами пользователей, системами доставки, телефонными номерами, локализацией интерфейсов и любыми формами, где требуется унификация географических данных. Основная сложность заключается в том, что разные стандарты используют различные форматы представления одной и той же страны.
ISO 3166 определяет три основных формата кодирования стран:
Двухбуквенные коды стран.
Примеры:
Этот формат наиболее часто используется в веб-разработке: доменные зоны, API геолокации, локализация.
Трёхбуквенные коды стран.
Примеры:
Используется там, где требуется более читаемая идентификация страны без неоднозначностей.
Числовые коды стран.
Примеры:
Часто применяется в статистических и финансовых системах, где текстовые коды неудобны.
Validator.js предоставляет три основные функции для работы с ISO 3166:
validator.isISO31661Alpha2('RU'); // true
validator.isISO31661Alpha2('RUS'); // false
Функция проверяет строго двухбуквенный формат. Входные данные должны быть в верхнем регистре, иначе результат будет отрицательным.
validator.isISO31661Alpha3('RUS'); // true
validator.isISO31661Alpha3('RU'); // false
Используется для трёхбуквенных кодов. Библиотека не выполняет автоматическую нормализацию регистра, поэтому входные значения должны быть стандартизированы заранее.
validator.isISO31661Numeric('643'); // true
validator.isISO31661Numeric('084'); // false
Числовые коды должны быть представлены строкой, даже если фактически это число.
При работе с кодами стран часто возникает необходимость предварительной нормализации данных:
Пример подготовки данных:
function normalizeCountryCode(code) {
return String(code).trim().toUpperCase();
}
validator.isISO31661Alpha2(normalizeCountryCode(' ru ')); // true
Валидация кодов стран чаще всего применяется в следующих сценариях:
if (!validator.isISO31661Alpha2(country)) {
throw new Error('Некорректный код страны');
}
function validateUserPayload(payload) {
return validator.isISO31661Alpha3(payload.countryCode);
}
const allowedCountries = ['RU', 'KZ', 'BY'];
if (!allowedCountries.includes(country)) {
throw new Error('Регион не поддерживается');
}
Validator.js не предоставляет отдельного стандарта для регионов внутри стран (штатов, областей, провинций), однако такие данные часто валидируются через сопутствующие функции:
isMobilePhoneПример проверки телефонного региона:
validator.isMobilePhone('77011234567', 'kk-KZ'); // Казахстан
validator.isMobilePhone('+49 151 12345678', 'de-DE'); // Германия
Во многих случаях код страны используется как часть локали:
en-USru-RUde-DEkk-KZValidator.js не валидирует локали напрямую как ISO 3166, но многие функции принимают их в качестве параметров.
Пример:
validator.isPostalCode('01001', 'DE'); // Германия
validator.isPostalCode('101000', 'RU'); // Россия
validator.isISO31661Alpha2('ru'); // false
validator.isISO31661Numeric(643); // false
validator.isISO31661Numeric('643'); // true
validator.isISO31661Alpha2('XX'); // false
В реальных проектах проверка страны часто объединяется с другими проверками:
function validateUser(data) {
return (
validator.isEmail(data.email) &&
validator.isISO31661Alpha2(data.country) &&
validator.isLength(data.username, { min: 3, max: 20 })
);
}
Функции проверки ISO-кодов в Validator.js работают на основе заранее подготовленных списков допустимых значений. Это обеспечивает:
Однако это также означает, что библиотека не учитывает динамические изменения геополитических данных и требует обновления версии для актуализации списков стран.
В некоторых системах стандартных ISO-кодов недостаточно. Тогда используется комбинация Validator.js и собственных словарей:
const supportedRegions = new Set(['RU', 'KZ', 'UZ']);
function isSupportedCountry(code) {
return validator.isISO31661Alpha2(code) && supportedRegions.has(code);
}
На клиентской стороне валидация кодов стран позволяет:
На серверной стороне: