` — для `MNT_SUBSCRIBER_ID` и данных чека. * PHPShop хранит его как ввёл покупатель: `+7(926) 111-11-11`, `8 926 111 11 11`, `9261111111`. */ final class PhoneNumber { /** E.164: не больше 15 цифр. */ private const MAX_DIGITS = 15; private const MIN_DIGITS = 10; private function __construct() {} /** * Нормализованный номер или null, если строка на телефон не похожа. * Российские номера приводятся к `+7`: `8XXXXXXXXXX` и десятизначный `9XXXXXXXXX`. */ public static function normalize(string $raw): ?string { if (preg_match('/[^0-9+()\-\s.]/', $raw) === 1) { return null; } $digits = preg_replace('/[^0-9]/', '', $raw) ?? ''; if ((strlen($digits) === 11) && ($digits[0] === '8')) { $digits = '7' . substr($digits, 1); } elseif ((strlen($digits) === 10) && ($digits[0] === '9')) { $digits = '7' . $digits; } $length = strlen($digits); if (($length < self::MIN_DIGITS) || ($length > self::MAX_DIGITS)) { return null; } return '+' . $digits; } }