Ниже — диалог с иишечкой, варианты обработки RegEx на выбор, для SQL, PHP, Python, JavaScript, VBA, Excel. Рабочие решения в качестве склеротника, чтоб в другой раз легче искалось.
Рекомендуемый формат хранения
Лучше всего хранить номера телефонов в каноническом (нормализованном) формате:
Только цифры (без пробелов, тире, скобок и других символов)
С кодом страны (префиксом), например
+7
или7
для РоссииВ текстовом поле (VARCHAR), а не как число
Пример: 79161234567
(для российского номера +7 (916) 123-45-67)
Обработка нежелательных символов
Перед сохранением в базу данных нужно:
Удалить все нецифровые символы: пробелы, тире, скобки, плюсы и т.д.
Оставить только цифры
При необходимости добавить код страны по умолчанию
Примеры
SQL (при вставке/обновлении)
-- Удаление всех нецифровых символов UPDATE contacts SET phone = REGEXP_REPLACE(phone, '[^0-9]', '', 'g') WHERE phone ~ '[^0-9]';
PHP
function normalizePhone($phone) { // Удаляем все нецифровые символы $normalized = preg_replace('/[^0-9]/', '', $phone); // Если номер начинается с 8 (российский), заменяем на 7 if (strlen($normalized) == 11 && $normalized[0] == '8') { $normalized[0] = '7'; } return $normalized; }
Python
import re def normalize_phone(phone): # Удаляем все нецифровые символы normalized = re.sub(r'[^\d]', '', phone) # Российские номера: заменяем 8 на 7 в начале if len(normalized) == 11 and normalized.startswith('8'): normalized = '7' + normalized[1:] return normalized
JavaScript
function normalizePhone(phone) { // Удаляем все нецифровые символы let normalized = phone.replace(/\D/g, ''); // Российские номера: заменяем 8 на 7 в начале if (normalized.length === 11 && normalized.startsWith('8')) { normalized = '7' + normalized.slice(1); } return normalized; }
Дополнительные рекомендации
Валидация: проверяйте длину номера и допустимые коды стран перед сохранением
Индексация: создавайте индекс по полю с телефоном для быстрого поиска
Отображение: форматируйте номер для вывода (добавляйте пробелы, тире и т.д. на уровне приложения)
Международные номера: храните с кодом страны
NULL vs пустая строка: определитесь, как обрабатывать отсутствие номера
Пример форматирования для вывода (Python):
def format_phone(normalized_phone): if len(normalized_phone) == 11 and normalized_phone.startswith('7'): return f"+7 ({normalized_phone[1:4]}) {normalized_phone[4:7]}-{normalized_phone[7:9]}-{normalized_phone[9:11]}" return normalized_phone # или другой формат для международных номеров
Обработка номеров телефонов в Excel
Примеры обработки номеров телефонов в Excel:
1. Удаление всех нецифровых символов
Формула для извлечения только цифр (сложный вариант для старых версий Excel до 2016):
=СУММПРОИЗВ(ПСТР(0&A2; КРУПН(ИНДЕКС(ЕЧИСЛ(--ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1))*СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 0); СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))))+1; 1)*10^СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2)))/10)
Более простая формула (для Excel 2016 и новее):
=ОБЪЕДИНИТЬ(""; ИСТИНА; ЕСЛИОШИБКА(ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1)+0; ""))
2. Форматирование номеров телефонов
Наводим красоту:
Отформатируем российские номера (из 11 цифр).
Добавим в начале +7, далее по шаблону скобки, тире и пробелы, получится так: +7 (000) 000-00-00
=ЕСЛИ(ДЛСТР(A2)=11; "+7 (" & ПСТР(A2;2;3) & ") " & ПСТР(A2;5;3) & "-" & ПСТР(A2;8;2) & "-" & ПСТР(A2;10;2); A2)
Настройка через формат ячеек:
Выделите ячейки
Правой кнопкой → Формат ячеек
Выберите «Все форматы» и введите:
Для российских номеров:
+7 (000) 000-00-00
Для международных:
+0 (000) 000-0000
3. Проверка корректности номера
Проверка длины номера:
=ЕСЛИ(ИЛИ(ДЛСТР(A2)=11; ДЛСТР(A2)=10); "Корректный"; "Некорректный")
Проверка кода страны/оператора:
=ЕСЛИ(И(ДЛСТР(A2)=11; ЛЕВСИМВ(A2;1)="7"); "Россия"; "Другая страна")
4. Массовая обработка с помощью «Текст по столбцам»
Выделите столбец с номерами
Данные → Текст по столбцам
Выберите «С разделителями» → Далее
Укажите разделители (пробел, скобки, тире)
Нажмите «Готово», затем объедините столбцы с цифрами
5. Замена 8 на +7 в начале номера
=ЕСЛИ(ЛЕВСИМВ(A2;1)="8"; "7"&ПРАВСИМВ(A2;ДЛСТР(A2)-1); A2)
Пример полной обработки
Столбец B (только цифры):
=ОБЪЕДИНИТЬ(""; ИСТИНА; ЕСЛИОШИБКА(ПСТР(A2; СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2))); 1)+0; ""))
Столбец C (нормализованный вид):
=ЕСЛИ(ЛЕВСИМВ(B2;1)="8"; "7"&ПРАВСИМВ(B2;ДЛСТР(B2)-1); B2)
Столбец D (форматированный вид):
=ЕСЛИ(ДЛСТР(C2)=11; "+7 (" & ПСТР(C2;2;3) & ") " & ПСТР(C2;5;3) & "-" & ПСТР(C2;8;2) & "-" & ПСТР(C2;10;2); C2)
К слову:
- Для работы функций ОБЪЕДИНИТЬ и ЕСЛИОШИБКА нужен Excel 2016 или новее
В более старых версиях Excel для удаления нецифровых символов можно использовать макрос VBA:
Макрос VBA для удаления нецифровых символов:
Function OnlyDigits(s As String) As String Dim i As Integer Dim result As String For i = 1 To Len(s) If IsNumeric(Mid(s, i, 1)) Then result = result & Mid(s, i, 1) End If Next OnlyDigits = result End Function
А как добавить макрос?
Если что, напомним как добавить макрос и заставить его работать:
1) В Excel, Word, PP и т.д., нажать Alt + F11, или кнопку Visual Basic на вкладке Разработчик. В меню редактора VBA вставить новый модуль Insert — Module
и вставить в окошко редактора расположенный выше код, далее можно сохранить код, нажав Ctrl + S и закрыть окно VBA (Alt + F4);
2) Нажать Alt + F8, выбрать макрос и нажать кнопку Выполнить.