Готовые шаблоны
Российский телефон — 11 цифр, начинающихся с 7 или 8. Все операторы используют 3-значный код после префикса. Базовый regex покрывает 99% реальных номеров с минимальной сложностью.
Шаблон 1 — простой (без форматирования)
^(?:\+7|7|8)\d{10}$Принимает только числа без пробелов и скобок: 89261234567, 79261234567, +79261234567. Для пользовательского ввода — сначала очистите строку от нецифровых символов.
Шаблон 2 — с форматированием (универсальный)
^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$Принимает форматы: +7 (495) 123-45-67, 8-926-123-45-67, +7 495 1234567, 8(495)1234567. Учитывает скобки, пробелы, дефисы между группами цифр.
Шаблон 3 — только мобильные
^(?:\+7|7|8)9\d{9}$Только мобильные (код начинается с 9). Жёстко: исключает городские номера (495, 812 и др.). Используйте, когда нужны только сотовые для SMS.
Российская система нумерации построена по стандарту E.164: код страны (7) + 3-значный код зоны или мобильного оператора + 7-значный абонентский номер. Общая длина — 11 цифр включая код страны.— Технические условия Россвязь, 2017
Коды операторов
Мобильные (все начинаются с 9)
- МТС: 910-919, 980-989, +новые после MNP
- Билайн: 903-906, 909, 951, 953-961, 963, 965-968
- Мегафон: 920-928, 936, 937, 999
- Tele2: 900, 902, 904, 908, 950, 952, 991-994
- Yota: 999 (виртуальный оператор Мегафона)
- Тинькофф Мобайл: 991-994 (виртуальный)
После 2017 года ввели MNP (Mobile Number Portability) — пользователь может перенести номер от одного оператора к другому, сохранив его. Поэтому код больше НЕ гарантированно указывает на оператора. Чтобы определить реального оператора — используйте платные API (например, Numverify, Twilio Lookup).
Городские коды (примеры)
- Москва: 495, 499 (после 495 → 7 цифр)
- СПб: 812 (после → 7 цифр)
- Новосибирск: 383
- Екатеринбург: 343
- Казань: 843
- Самара: 846
- Уфа: 347
Региональные коды могут быть 3-5 цифр. Длина абонентского номера — 5-7 цифр в зависимости от размера города.
Нормализация формата
Хранение в БД должно быть в едином формате. Стандарт — E.164: +79261234567 (плюс + 11 цифр) или 79261234567 (без плюса). При вводе принимайте любой формат, потом нормализуйте:
JavaScript
function normalizePhoneRu(input) {
// 1. Убираем всё кроме цифр
let digits = input.replace(/\D/g, '');
// 2. Если 11 цифр и начинается с 8 - меняем на 7
if (digits.length === 11 && digits[0] === '8') {
digits = '7' + digits.slice(1);
}
// 3. Если 10 цифр - добавляем 7 в начало
if (digits.length === 10) {
digits = '7' + digits;
}
// 4. Проверка валидности
if (digits.length !== 11 || digits[0] !== '7') {
return null; // невалидный
}
return digits; // 79261234567
}
function formatPhoneRu(digits) {
// 79261234567 → +7 (926) 123-45-67
return `+7 (${digits.slice(1, 4)}) ${digits.slice(4, 7)}-${digits.slice(7, 9)}-${digits.slice(9)}`;
}Python
import re
def normalize_phone_ru(input_str):
digits = re.sub(r'\D', '', input_str)
if len(digits) == 11 and digits[0] == '8':
digits = '7' + digits[1:]
if len(digits) == 10:
digits = '7' + digits
if len(digits) != 11 or digits[0] != '7':
return None
return digits
def format_phone_ru(digits):
return f"+7 ({digits[1:4]}) {digits[4:7]}-{digits[7:9]}-{digits[9:11]}"Лучшие практики
- Не блокируйте пользователя. Принимайте любой формат, нормализуйте на бэкенде. Жёсткая фронтенд-валидация раздражает.
- Используйте input mask. imask.js, react-input-mask — пользователь видит формат +7 (___) ___-__-__ при вводе.
- Type="tel" в HTML. На мобильных открывает цифровую клавиатуру, не QWERTY.
- Подтверждение SMS. Реальная валидация — отправить код. Любая regex говорит только «формат правильный».
- Кириллические буквы. Иногда пользователи случайно вводят «8 (4З5) 1З4-56-78» — буквы похожи на цифры. Очищайте все нецифровые символы.
- Международная поддержка. Если работаете не только с РФ — используйте libphonenumber вместо собственных регексов.
- E.164 — The international public telecommunication numbering plan. ITU-T. itu.int/rec/T-REC-E.164. 2010.
- libphonenumber — Google's phone number library. Google. github.com/google/libphonenumber. 2024.
- Россвязь — план нумерации сетей связи общего пользования. Россвязь. rossvyaz.gov.ru. 2024.
