- PVSM.RU - https://www.pvsm.ru -

И это становится реальной проблемой, когда вам нужно сохранить телефонные номера в базе данных и затем извлекать из неё записи по ним.
В сфере IT и компьютерных науках нормализация означает приведение чего-либо к согласованности или стандарту. В отношении телефонных номеров это подразумевает, что все их записи делаются в согласованном формате.
Существует ли международный стандарт для номеров телефонов? Международный союз электросвязи (International Telecommunication Union [12], ITU) опубликовал стандарт E.123 [13], который определяет стандартные записи телефонных номеров, email и веб-адресов.
Записанный в формате E.123, международный телефонный номер выглядит так:
+12 345 678 901
Символ + указывает на международный формат номера. Код страны здесь представлен числом 12, а остальные цифры — это, собственно, сам телефонный номер.
Но когда людей просят ввести номер в поле формы, большинство записывают его так, как принято в их регионе, или как им больше нравится. В результате варианты написания могут сильно отличаться как от страны к стране, так и от человека к человеку.
Например, в США тот же телефонный номер будет записан так:
(345) 678-901
В Великобритании местные номера записываются так:
01234 56 7890
А в Индии так:
0123-456-7890
При этом некоторые люди порой вместо символа + используют международный код доступа 00.
0012 345 678 901
Когда вы сохраняете телефонные номера в базе данных, вам нужна возможность находить их независимо от того, как они были введены.
Представьте, что у вас в базе есть следующие номера:
123-456-7890(234) 567-89010345 / 678 9012+456 789 0123567-890-1234
Если же вам поступит вызов с +12 345 678 9012, как вы найдёте его в базе данных, чтобы получить информацию о соответствующем клиенте?
Наименее неоднозначным вариантом для хранения телефонного номера является определённый E.123 международный формат, в котором отсутствуют пробелы: +123456789012.
Но как к нему прийти?
Лучше всего будет попросить пользователей изначально вводить свои номера в этом формате.
Для этого можно предоставить им выпадающий список стран и автоматически форматировать телефонный номер на основе выбранного кода.
Например, библиотека International Telephone Input [14] предлагает такой удобный UI:

Источник: github.com/jackocnr/intl-tel-input [14]
Если вы не можете обеспечить, чтобы пользователи вводили номера телефонов в подходящем формате, потому что имеете дело с легаси-данными или импортируете их из другого источника, то задача усложнится, но не станет невозможной.
Для начала рассмотрите вариант использования библиотеки. У Google есть опенсорсное решение под названием libphonenumber [15], которое окажется полезным во многих случаях.
Если вы работаете с Python, попробуйте портированную на этот язык версию той же libphonenumber — phonenumbers [16].
Также есть её вариант для JavaScript, а именно google-libphonenumber [17].
Но иногда вам потребуется написать собственную функцию нормализации или обрабатывать особые случаи, которые не может обработать библиотека из-за недостатка контекста.
Я же сосредоточусь на том подавляющем числе сценариев, в которых вашим основным врагом выступает несогласованное написание телефонных номеров. Кстати, в разделе «Философия телефонных номеров» [10] приведены наиболее странные причины такого написания.
Вот список шагов, которые вам потребуется проделать для стандартизации:
При удалении нечисловых символов на первом шаге нужно быть очень внимательным, так как некоторые из них могут служить для определения кода области.
Способ написания телефонного номера может дать некоторые подсказки относительно кода страны и области. Например, в США код области зачастую включается в скобки:
(234) 567-8901А иногда отделяется пробелом или слэшем:
0345 / 678 901201234 56 7890Учитывайте эти варианты написания, чтобы лишний раз не гадать о коде страны или области.
Если вы имеете дело с телефонными номерами одной страны, то можете предположить, что либо в эти номера уже включён соответствующий код в виде +1, +12 или +123, либо это местные номера.
Люди могут также вводить код страны без символа +, например, указывая только 1 или 12.
Если местный номер начинается с одного 0, уберите этот 0 и добавьте код страны. Если номер начинается с 00, уберите 00, но предположите, что код страны уже присутствует.
01234 56 7890 станет +441234 56 78900044 1234 56 7890 станет +441234 56 7890Если вы работаете с номерами из разных стран, вам потребуется понять, какую страну предполагал пользователь, когда вводил свой номер.
Если вам повезёт, и нужно будет обработать всего несколько стран, коды области могут дать подсказку, поскольку среди них есть такие, которые используются в одной стране, но не в других.
В качестве заключительного шага удалите все нечисловые символы, кроме + в начале.
Итоговый нормализованный номер будет выглядеть так:
+123456789012
Теперь его можно сохранить в виде строки.
Когда вам нужно найти телефонный номер, предварительно нормализуйте поисковое выражение аналогичным образом.
На всякий случай желательно также сохранить исходный номер. Он может потребоваться позднее для верификации или показа пользователю.
Должен признаться, что преподнёс ситуацию гораздо проще, чем она обстоит на самом деле. Предыдущая часть статьи в основном охватывает те случаи, с которыми вы никогда не столкнётесь, и в реальности всё гораздо запутанней.
Более подробно эта тема раскрыта в статье «Falsehoods Programmers Believe About Phone Numbers [18]», которую можно найти в репозитории библиотеки libphonenumber.
Вот ряд наиболее коварных аспектов, в отношении которых нужно быть внимательными:
7 не равнозначен номеру 007.Сохранение телефонных номеров в том виде, в котором они вводятся, с большой вероятностью создаст проблемы при их дальнейшем поиске. Поэтому желательно их изначально нормализовать.
Вот краткий перечень основных пунктов статьи:
Автор: Дмитрий Брайт
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/telefonny-e-nomera/392408
Ссылки в тексте:
[1] Что такое нормализованный телефонный номер?: #anchorid1
[2] В форматах телефонных номеров неразбериха: #anchorid2
[3] Почему это проблема: #anchorid3
[4] Как нормализовать телефонный номер: #anchorid4
[5] Через пользовательский интерфейс: #anchorid5
[6] Обработка имеющихся данных: #anchorid6
[7] Исключите нечисловые символы: #anchorid7
[8] Определите код страны: #anchorid8
[9] Сохраните только цифры и символ +: #anchorid9
[10] Философия телефонных номеров: #anchorid10
[11] Заключение: #anchorid11
[12] International Telecommunication Union: https://www.itu.int/
[13] E.123: https://www.itu.int/rec/T-REC-E.123
[14] International Telephone Input: https://github.com/jackocnr/intl-tel-input
[15] libphonenumber: https://github.com/google/libphonenumber
[16] phonenumbers: https://pypi.org/project/phonenumbers/
[17] google-libphonenumber: https://www.npmjs.com/package/google-libphonenumber
[18] Falsehoods Programmers Believe About Phone Numbers: https://github.com/google/libphonenumber/blob/master/FALSEHOODS.md
[19] Источник: https://habr.com/ru/companies/ruvds/articles/824708/?utm_source=habrahabr&utm_medium=rss&utm_campaign=824708
Нажмите здесь для печати.