Yandex Metrika
sanches.free 2 просмотра

Номера телефонов в Bitrix D7: Parser, Formatter и нормализация

Зачем не изобретать свой разбор

В ядре main уже подключена обёртка над Google libphonenumber: \Bitrix\Main\PhoneNumber\Parser и набор констант формата \Bitrix\Main\PhoneNumber\Format. Это даёт предсказуемое поведение для международных номеров, кодов стран и валидации — важно для CRM, SMS-шлюзов и дублей в базе.

Разбор строки в объект

Любой ввод пользователя (с пробелами, скобками или без плюса) удобно прогнать через singleton-парсер. Результат — объект с методами форматирования и метаданными страны:

use Bitrix\Main\PhoneNumber\Parser;

$rawDial = '+7 (999) 999-99-99';
$parsed = Parser::getInstance()->parse($rawDial);

Если строка вообще не похожа на телефон, поведение зависит от версии libphonenumber и контекста; для бизнес-логики опирайтесь на isValid() ниже, а не только на факт успешного вызова parse().

Форматы вывода

Метод format() принимает одну из констант перечисления формата. Три самых полезных варианта:

  • \Bitrix\Main\PhoneNumber\Format::E164 — канонический «+79999999999» для API и уникальных ключей.
  • \Bitrix\Main\PhoneNumber\Format::INTERNATIONAL — привычный международный вид с пробелами, например «+7 999 999-99-99».
  • \Bitrix\Main\PhoneNumber\Format::NATIONAL — национальное представление для отображения в интерфейсе конкретной страны (для РФ часто «8 (999) 999-99-99»).
use Bitrix\Main\PhoneNumber\Format;

$e164 = $parsed->format(Format::E164);
$intl = $parsed->format(Format::INTERNATIONAL);
$nat = $parsed->format(Format::NATIONAL);

Страна и код страны

Для маршрутизации по региону или фильтров в админке:

$alpha2 = $parsed->getCountry();      // например "RU"
$digitsCc = $parsed->getCountryCode(); // например "7"

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

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

if ($parsed->isValid()) {
    // можно нормализовать и записывать
}

Страна по умолчанию из настроек

В настройках главного модуля есть опция phone_number_default_country (ISO Alpha-2). Её же отдаёт API:

$fallbackAlpha2 = Parser::getDefaultCountry();

Она влияет на разбор локальных номеров без международного префикса: без явной страны парсер опирается на это значение.

Нормализация одной строкой

Если нужен только E164 без промежуточных шагов, есть ярлык:

$normalized = Parser::getInstance()->normalizePhoneNumber($rawDial);

Используйте его там, где не нужны промежуточные форматы и проверки; для сценариев «покажи ошибку пользователю» чаще удобнее полный объект после parse() и вызов isValid().

На что обратить внимание в проекте

  • При интеграциях сохраняйте в базе именно E164 — проще искать дубли и строить уникальные индексы.
  • Не смешивайте форматирование на уровне шаблонов со строковой склейкой в PHP для одних и тех же полей.
  • После смены «страны по умолчанию» в админке перепроверьте разбор локальных номеров в формах, где пользователь не вводит «+».

Итог

Parser и Format закрывают типовой контур «ввели как попало → нормализовали → проверили → отдали провайдеру или в интерфейс». Это надёжнее ручных preg_replace и совпадает с логикой полей телефона внутри экосистемы Битрикс.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии