# Автозамена номеров телефонов

Есть много способов записать один и тот же номер телефона. `81234567890`, `+71234567890`, `1234567890`, `8 (123) 456-78-90` - только несколько очевидных примеров для российских номеров, а если Вам звонят иностранные клиенты со всего мира, то количество вариантов возрастает многократно.\
Для человека между этими вариантами нет большой разницы - все сработают если набрать, сравнить два формата и понять что номер один и тот же очень легко. Но для программ это совершенно разные номера. Например, если контакт в CRM сохранён с номером на +7, а в поиске ввести с 8, то контакт может не найтись.

Для решения таких проблем раньше использовалось только [форматирование номеров в кастомизациях](https://docs.itgrix.ru/custom_common/client-phone-number), поэтому в новых версиях Itgrix bx [3.7.0](https://docs.itgrix.ru/changelog-bx#3.7.0) и Itgrix amo [2.10.0](https://docs.itgrix.ru/changelog-amo#2.10.0) мы добавляем функцию автозамены, позволяющую настраивать форматирование номеров регулярными выражениями (regexp) в интерфейсе настройки модуля (в админке).

![](https://349598197-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M-rywOcELBwBcmtSBHS%2Fuploads%2Fgit-blob-b09a39f68b12bcec0b3f1bc645b8975867f675d8%2Fimage.png?alt=media)

{% hint style="info" %}

1. Автозамена модифицирует номера клиентов и/или пользователей, совпадающие с **шаблонами**, при помощи подстановки **замен**. Шаблонов может быть несколько.
2. Операции автозамены выполняются перед отправкой запросов в CRM для входящих звонков, поэтому автозамена влияет на создание/поиск сущностей и задач и поиск пользователей.
3. Для каждого номера замена выполняется **по всему списку шаблонов последовательно**. Это значит что **порядок шаблонов важен**, потому что выполнение первой замены может обеспечить или предотвратить совпадение номера с последующими шаблонами.
   {% endhint %}

## Регулярные выражения

Для описания правил автозамены используется язык регулярных выражений (regexp), так же как и в кастомизациях. Это общепринятый способ поиска и замены текста.

Для того чтобы создавать и тестировать регулярные выражения, мы предлагаем воспользоваться онлайн инструментами, такими как [regex101.com](https://regex101.com) (в меню слева нужно выбрать вариант **Golang** и ниже для проверки замены - **Substitution**).

### Краткий список полезных элементов шаблонов

**Символы**

* `^` - начало строки
* `$` - конец строки
* `.` - любой символ
* `\d` - цифра
* `\D` - не цифра
* `\w` - цифра или буква
* `\W` - не цифра и не буква
* `\s` - пробел (включая необычные варианты вроде неразрывных пробелов)
* `\S` - не пробел
* `[ab\s0-5]` - один из символов: `a`, `b`, пробел, цифра от `0` до `5`
* `abc 123` - буквально строка "abc 123", может быть частью большей строки
* `abc|123` - строка "abc" или строка "123", может быть частью большей строки
* `^abc 123$` - строка "abc 123" от начала до конца без других символов до и после
* `\(`, `\)`, `\[`, `\]`, `\{`, `\}`, `\+`, `\?`, `\*`, `\.`, `\|`, `\\` - буквальное представление символов, которые без `\` имеют особый смысл

**Повторения**

Сразу после символа (или группы символов) можно указать сколько раз подряд он может присутствовать.

* `?` - 0 или 1 раз
* `+` - 1 и более раз
* `*` - любое количество раз
* `{5}` - 5 раз
* `{5,10}` - от 5 до 10 раз
* `{,10}` - от 0 до 10 раз
* `{5,}` - от 5 и более раз

Например, `\d{10}` означает "10 цифр", `\+?` означает "0 или 1 знак +", а `0+` - один и более нулей.

**Группы, замена**

Символы можно объединять в группы с помощью скобок. Это полезно при описании повторения нескольких символов, например `(10){3}` означает "101010".\
Текст групп можно использовать при замене при помощи подстановки вида `$N`, где `N` - порядковый номер группы.\
Например, при замене шаблона `8(\d{6})(\d{4})` подстановка `$1` будет означать содержимое группы `(\d{6})`, то есть первые 6 цифр после "8", а подстановка `$2` будет означать содержимое группы `(\d{4})`, то есть последующие 4 цифры.

## Примеры автозамены номеров клиентов

| Шаблон                               | Замена             | Описание                                                                                                                                                                                                                                                                                                 |
| ------------------------------------ | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `^\+?7(\d{10})$`                     | `8$1`              | <p>Заменяет префиксы <code>+7</code> и <code>7</code> в начале номера, состоящего из префикса и 10 цифр, на <code>8</code>, например <code>+74951234567</code> → <code>84951234567</code> и <code>74951234567</code> → <code>84951234567</code><br><strong>Этот шаблон включен по умолчанию</strong></p> |
| `^\+7`                               | `8`                | Заменяет `+7` в начале любого номера на `8`, например `+712345671234567` → `812345671234567`                                                                                                                                                                                                             |
| `.*(\d{10})$`                        | `8$1`              | Заменяет номер, имеющий в конце 10 цифр, на `8` и эти 10 цифр, например `0071234567890` → `81234567890`                                                                                                                                                                                                  |
| `^(\d{7})$`                          | `8495$1`           | Добавляет к 7-значному номеру префикс `8495`, например `1234567` → `84951234567`                                                                                                                                                                                                                         |
| `\D`                                 | (пустая строка)    | Удаляет все символы кроме цифр, например `+7 (495) 123-45-67` → `74951234567`                                                                                                                                                                                                                            |
| `[\s()-]`                            | (пустая строка)    | Удаляет все символы пробелов, скобок и дефисов, например `+7 (495) 123-45-67` → `+74951234567`                                                                                                                                                                                                           |
| `^(.*)(\d{3})(\d{3})(\d{2})(\d{2})$` | `$1 ($2) $3-$4-$5` | Форматирует номер в виде `x (xxx) xxx-xx-xx`, например `+74951234567` → `+7 (495) 123-45-67`                                                                                                                                                                                                             |
| `^0\d{2}(\d+)$`                      | `8$1`              | Заменяет номер вида "ноль, две цифры, ещё цифры" на `8` и цифры в конце номера, например `0771234567890123` → `81234567890123`                                                                                                                                                                           |
| `1234567$`                           | `7654321`          | Заменяет `1234567` в конце номера на `7654321`, например `84951234567` → `84957654321`                                                                                                                                                                                                                   |
| `^84951234567$`                      | `84957654321`      | Заменяет буквально номер `84951234567` на `84957654321`                                                                                                                                                                                                                                                  |

## Примеры автозамены номеров пользователей

| Шаблон             | Замена | Описание                                                                                                                    |
| ------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------- |
| `.*(\d{4}$)`       | `$1`   | Удаляет из номера всё кроме последних 4 цифр, например `+71234564321` → `4321`                                              |
| `^8123456(\d{4})$` | `$1`   | Удаляет из номера префикс `8123456`, оставляя последние 4 цифры, например `849576543214321` → `4321`                        |
| `.*123456(\d{4})$` | `$1`   | Удаляет из номера, заканчивающегося на `123456` и ещё 4 цифры, всё кроме последних 4 цифр, например `+71234564321` → `4321` |
| `^1(\d{3})$`       | `2$1`  | Заменяет первую цифру `1` в 4-значном номере на `2`, например `1234` → `2234`                                               |
| `^1234$`           | `4321` | Заменяет буквально номер `1234` на `4321`                                                                                   |
