Меню

форматирование номера телефона php

Форматирование телефонных номеров на PHP

Возникла задача автоматического форматирования телефонных номеров в виде страна (город) номер, и первым делом я обратился к существующим решениям.
К сожалению, оказалось, что все найденные решения основываются на обычном подгоне строки под пользовательский формат, имея ограниченную область применения и ошибки при выходе за ее пределы.

Для начала приведу обзор найденных решений. Тем, кому это не интересно, рекомендую прокрутить ниже до заголовка «Форматы телефонных номеров» — там уже представлен мой вариант разбора номера с ссылкой на код.

Всеуничтожающий примитив

Один из простых вариантов шустрого форматирования телефонных номеров, но каждое такое решение ориентировано на телефонные номера из конкретной локальной зоны и не является решением задачи.

Форматирование с помощью sscanf

Не смотря на простое решение, эта функция уже умеет форматировать номера длиной 7, 10 и более цифр, но попадись ей номер из российской глубинки, она подавится и выдаст ошибочный результат.

Symfony, lib/helpers/PhoneHelper.php, format_phone

Функция позволяет не только форматировать в XXX-XXXX, (XXX) XXX-XXXX и X (XXX) XXX-XXXX, но и конвертировать номера, написанные цифрами. Ограниченность функции в форматировании номеров длиной 7, 10 и 11 символов никак не подходит.

Форматы телефонных номеров

Из вики-статьи видно, что никакого простого и удобного паттерна для быстрого форматирования всех номеров не существует. Коды стран регистрируются, подобно доменным зонам, а коды городов — остаются на совести каждой из стран.

Другими словами, маршрутизация звонков идет по маске, начиная с кода страны: звонок, направленный в конкретную страну далее пробивает себе маршрут в соответствии с кодами области, города, района и т.д. начиная с самой левой цифры, пока последнее звено не перебросит его на конкретный телефонный/факсовый аппарат. Проблема усложняется еще и тем, что коды городов внутри стран точно так же не поддаются единой сквозной стандартизации, т.е. в худшем из вариантов для правильного форматирования номеров придется использовать двумерный массив с кодами стран и их городов.

На самом деле, все оказалось не так страшно. В каждой стране можно разделить все коды городов на две части: на те, что в большинстве своем совпадают по длине, и все остальные. Этого достаточно, чтобы резко сократить область перебора кодов при сравнении. Т.е. можно создать массив из данных по каждой стране вида:

// тесты
echo phone( «+38 (044) 226-22-04» ). «
» ;
echo phone( «0038 (044) 226-22-04» ). «
» ;
echo phone( «+79263874814» ). «
» ;
echo phone( «4816145» ). «
» ;
echo phone( «+44 (0) 870 770 5370» ). «
» ;
echo phone( «0044 (0) 870 770 5370» ). «
» ;
echo phone( «+436764505509» ). «
» ;
echo phone( «(+38-048) 784-15-46 » ). «
» ;
echo phone( «(38-057) 706-34-03 » ). «
» ;
echo phone( «+38 (044) 244 12 01 » ). «
» ;
?>

Функция полностью решает поставленную задачу.
Из недостатков функции следует отметить отсутствие анализа медленных участков с целью оптимизаци, а также обработки телефонных номеров, где есть код города, но нет кода страны (в этом случае достаточно бить на блоки функцией phoneBlocks или воспользоваться одним из решений выше). При использовании ее в какой-либо реализации необходимо заменить глобальную переменную на ссылку в параметре, а также можно доработать или заменить формат вывода, за который отвечает функция phoneBlocks.

Самое интересное

Используя информацию с сайтов:
http://www.mtt.ru/info/def/index.wbp
http://www.hella.ru/code/codeuro.htm
http://www.scross.ru/guide/phone-global/
я собрал массив данных по всем представленным странам, включая города-исключения, флаги zeroHack, а также коды мобильных сетей. Код можно загрузить здесь.

Быстродействие

Вопреки всем самым пессимистичным ожиданиям, код отрабатывает 10.000 номеров менее чем за 2 секунды.

Источник

Форматирование телефонных номеров на PHP

Возникла задача автоматического форматирования телефонных номеров в виде страна (город) номер, и первым делом я обратился к существующим решениям.
К сожалению, оказалось, что все найденные решения основываются на обычном подгоне строки под пользовательский формат, имея ограниченную область применения и ошибки при выходе за ее пределы.

Для начала приведу обзор найденных решений. Тем, кому это не интересно, рекомендую прокрутить ниже до заголовка «Форматы телефонных номеров» — там уже представлен мой вариант разбора номера с ссылкой на код.

Минусующим, отписывайтесь, пожалуйста о причине минуса — исправлю недочеты, если есть.

Всеуничтожающий примитив

(Найденное решение. Мое ниже)
Первое, на что я наткнулся — были сообщения на форумах и банки скриптов, предлагающие решения следующего плана:

Один из простых вариантов шустрого форматирования телефонных номеров, но каждое такое решение ориентировано на телефонные номера из конкретной локальной зоны и не является решением задачи.

Форматирование с помощью sscanf

(Найденное решение. Мое ниже)

Не смотря на простое решение, эта функция уже умеет форматировать номера длиной 7, 10 и более цифр, но попадись ей номер из российской глубинки, она подавится и выдаст ошибочный результат.

Symphony, lib/helpers/PhoneHelper.php, format_phone

(Найденное решение. Мое ниже)

Функция позволяет не только форматировать в XXX-XXXX, (XXX) XXX-XXXX и X (XXX) XXX-XXXX, но и конвертировать номера, написанные цифрами. Ограниченность функции в форматировании номеров длиной 7, 10 и 11 символов никак не подходит.

Форматы телефонных номеров

Из вики-статьи видно, что никакого простого и удобного паттерна для быстрого форматирования всех номеров не существует. Коды стран регистрируются, подобно доменным зонам, а коды городов — остаются на совести каждой из стран.

Другими словами, маршрутизация звонков идет по маске, начиная с кода страны: звонок, направленный в конкретную страну далее пробивает себе маршрут в соответствии с кодами области, города, района и т.д. начиная с самой левой цифры, пока последнее звено не перебросит его на конкретный телефонный/факсовый аппарат. Проблема усложняется еще и тем, что коды городов внутри стран точно так же не поддаются единой сквозной стандартизации, т.е. в худшем из вариантов для правильного форматирования номеров придется использовать двумерный массив с кодами стран и их городов.

На самом деле, все оказалось не так страшно. В каждой стране можно разделить все коды городов на две части: на те, что в большинстве своем совпадают по длине, и все остальные. Этого достаточно, чтобы резко сократить область перебора кодов при сравнении. Т.е. можно создать массив из данных по каждой стране вида:

Затем провести предварительную обработку данных, дополнив его полями, сужающими область перебора, exceptions_max и exceptions_min — максимальной и минимальной длиной кода городов-исключений, соответственно. Также необходимо учесть страны, в которых коды городов начинаются на 0 — отразим эту «особенность» полем zeroHack. Как пример:

После этого возьмем подходящие участки кода из решений выше и сделаем функцию форматирования:

// тесты
echo phone( «+38 (044) 226-22-04» ). «
» ;
echo phone( «0038 (044) 226-22-04» ). «
» ;
echo phone( «+79263874814» ). «
» ;
echo phone( «4816145» ). «
» ;
echo phone( «+44 (0) 870 770 5370» ). «
» ;
echo phone( «0044 (0) 870 770 5370» ). «
» ;
echo phone( «+436764505509» ). «
» ;
echo phone( «(+38-048) 784-15-46 » ). «
» ;
echo phone( «(38-057) 706-34-03 » ). «
» ;
echo phone( «+38 (044) 244 12 01 » ). «
» ;
?>

+380(44)226-22-04
+380(44)226-22-04
+7(926)387-48-14
481-61-45
+44(0870)770-53-70
+44(0870)770-53-70
+43(6764)50-55-09
380(4878)415-46
380(5770)634-03
+380(44)244-12-01

Функция полностью решает поставленную задачу.
Из недостатков функции следует отметить отсутствие анализа медленных участков с целью оптимизаци, а также обработки телефонных номеров, где есть код города, но нет кода страны (в этом случае достаточно бить на блоки функцией phoneBlocks или воспользоваться одним из решений выше). При использовании ее в какой-либо реализации необходимо заменить глобальную переменную на ссылку в параметре, а также можно доработать или заменить формат вывода, за который отвечает функция phoneBlocks.

Быстродействие

Вопреки всем самым пессимистичным ожиданиям, код отрабатывает 10.000 номеров менее, чем за 2 секунды.

UPD Готовятся поправки:

Источник

Formatting Phone Numbers in PHP

I am working on an SMS app and need to be able to convert the sender’s phone number from +11234567890 to 123-456-7890 so it can be compared to records in a MySQL database.

The numbers are stored in the latter format for use elsewhere on the site and I would rather not change that format as it would require modifying a lot of code.

How would I go about this with PHP?

photo

uXkpJ

22 Answers 22

This is a US phone formatter that works on more versions of numbers than any of the current answers.

And here is a breakdown of the regex:

Updated: March 11, 2015 to use <0,7>instead of

This function will format international (10+ digit), non-international (10 digit) or old school (7 digit) phone numbers. Any numbers other than 10+, 10 or 7 digits will remain unformatted.

Assuming that your phone numbers always have this exact format, you can use this snippet:

Phone numbers are hard. For a more robust, international solution, I would recommend this well-maintained PHP port of Google’s libphonenumber library.

Using it like this,

you will get the following output:

I’d recommend using the E164 format for duplicate checks. You could also check whether the number is a actually mobile number or not (using PhoneNumberUtil::getNumberType() ), or whether it’s even a US number (using PhoneNumberUtil::getRegionCodeForNumber() ).

As a bonus, the library can handle pretty much any input. If you, for instance, choose to run 1-800-JETBLUE through the code above, you will get

It works just as nicely for countries other than the US. Just use another ISO country code in the parse() argument.

bLYjW

It’s faster than RegEx.

photo

XU59a

Here’s my USA-only solution, with the area code as an optional component, required delimiter for the extension, and regex comments:

And here’s the script to test it:

The sscanf function takes as a second parameter a format string telling it how to interpret the characters from the first string. In this case, it means 2 characters ( %2c ), 3 characters, 3 characters, 4 characters.

I have used a similar function to format Australian phone numbers.

Note that from the perspective of storing the phone number:

vYiIK

Here’s a simple function for formatting phone numbers with 7 to 10 digits in a more European (or Swedish?) manner:

It is based on Google’s library for parsing, formatting, and validating international phone numbers: https://github.com/google/libphonenumber

I see this being possible using either some regex, or a few substr calls (assuming the input is always of that format, and doesn’t change length etc.)

Try something like:

WDilC

I think I fixed it. Working for current input files and have following 2 functions to get this done!

function format_phone_number:

function validate_phone_number:

Notice I have this in a class lib, so thus the «self::validate_phone_number» call from the first function/method.

Notice line # 32 of the «validate_phone_number» function where I added the:

to get me the false return needed if not valid phone number.

Still need to test this against more data, but working on current data, with current format and I’m using style ‘8’ for this particular data batch.

Also I commented out the «extension» logic as I was constantly getting errors from it, seeing I do not have any of that info in my data.

vdUNI

this takes 7, 10 and 11 digit, removes additional characters and adds dashes by going right to left through the string. change the dash to a space or dot.

photo

I know the OP is requesting a 123-456-7890 format, but, based on John Dul’s answer, I modified it to return the phone number in parentheses format, e.g. (123) 456-7890. This one only handles 7 and 10 digit numbers.

United Kingdom Phone Formats

For the application I developed, I found that people entered their phone number ‘correctly’ from a human readable form, but inserted varous random characters such as ‘-‘ ‘/’ ‘+44’ etc. The problem was that the cloud app that it needed to talk to was quite specific about the format. Rather than use a regular expression (can be frustrating for the user) I created an object class which processes the entered number into the correct format before being processed by the persistence module.

+441234567890 produces (01234) 567 890
02012345678 produces (020) 1234 5678
1923123456 produces (01923) 123 456
01923123456 produces (01923) 123 456
01923hello this is text123456 produces (01923) 123 456

I’m sure that there are more efficient solutions, but this one has proved extremely reliable. More formats can easily be accomodated by adding to the teleNum function at the end.

The procedure is invoked from the calling script thus

Источник

Форматирование телефонных номеров в PHP

Я работаю над SMS app и необходимо иметь возможность конвертировать номер телефона отправителя из +11234567890 to 123-456-7890 таким образом, его можно сравнить с записями в база данных MySQL.

числа хранятся в последнем формате для использования в другом месте на сайте, и я бы предпочел не изменять этот формат, поскольку это потребует изменения большого количества кода.

как бы я пойти об этом с РНР?

17 ответов

это форматер телефона США, который работает на большем количестве версий чисел, чем любой из текущих ответов.

и вот разбивка регулярного выражения:

обновлено: 11 марта 2015 использовать <0,7>вместо

эта функция будет форматировать международные (10 + цифр), немеждународные (10 цифр) или старые школьные (7 цифр) телефонные номера. Любые числа, кроме 10+, 10 или 7 цифр, останутся неформатированными.

предполагая, что ваши телефонные номера всегда имеют этот точный формат, вы можете использовать этот фрагмент:

номера телефонов трудно. Для более надежного, международного решения я бы рекомендовал это ухоженный PHP порт от Google libphonenumber библиотека.

вы получите следующий результат:

Я бы рекомендовал использовать E164 формат для повторяющихся проверок. Вы также можете проверить, является ли номер фактически мобильным номером или нет (используя PhoneNumberUtil::getNumberType() ), или это даже номер США (используя PhoneNumberUtil::getRegionCodeForNumber() ).

в качестве бонуса, библиотека может обрабатывать почти любой вход. Если вы, например, решите запустить 1-800-JETBLUE через код выше, вы получите

он работает так же хорошо для других стран, чем США. Просто используйте другой код страны ISO в

вот мое решение только для США, с кодом области в качестве дополнительного компонента, необходимым разделителем для расширения и комментариями regex:

и вот сценарий, чтобы проверить его:

Я вижу, что это возможно с помощью некоторых регулярных выражений или нескольких вызовов substr (предполагая, что вход всегда имеет этот формат и не изменяет длину и т. д.)

должен это сделать.

вот простая функция для форматирования телефонных номеров с 7 до 10 цифр по-европейски (или по-шведски?) манера:

попробуйте что-то вроде:

другой вариант-легко обновляется, чтобы получить формат из конфигурации.

это занимает 7, 10 и 11 цифр, удаляет дополнительные символы и добавляет тире, идя справа налево через строку. измените тире на пробел или точку.

кажется, я его починил. Работа для текущих входных файлов и имеют следующие 2 функции, чтобы сделать это!

format_phone_number функции:

validate_phone_number функции:

обратите внимание, что у меня это в классе lib, поэтому, таким образом, вызов «self::validate_phone_number» из первой функции/метода.

строка уведомления # 32 функции «validate_phone_number», где I добавлено:

чтобы получить мне ложное возвращение, необходимое, если не действительный номер телефона.

все еще нужно протестировать это против большего количества данных, но работать с текущими данными, с текущим форматом, и я использую стиль » 8 » для этого конкретного пакета данных.

также я прокомментировал логику «расширения», поскольку я постоянно получал от нее ошибки, видя, что у меня нет этой информации в моих данных.

Источник

Форматирование телефонных номеров в PHP

Числа хранятся в последнем формате для использования в других местах на сайте, и я бы предпочел не менять этот формат, поскольку это потребует изменения большого количества кода.

Как мне это сделать с помощью PHP?

Это форматировщик телефонов в США, который работает с большим количеством версий чисел, чем любой из текущих ответов.

А вот разбивка регулярного выражения:

Обновлено: 11 марта 2015 г. для использования <0,7>вместо

Эта функция форматирует международные (10+ цифр), немеждународные (10-значные) или старые (7-значные) телефонные номера. Любые числа, кроме 10+, 10 или 7 цифр, останутся неформатированными.

Предполагая, что ваши номера телефонов всегда имеют именно такой формат, вы можете использовать этот фрагмент:

вы получите следующий результат:

Я бы рекомендовал использовать этот E164 формат для повторяющихся проверок. Вы также можете проверить, действительно ли это номер мобильного телефона (с использованием PhoneNumberUtil::getNumberType() ) или даже номер в США (с использованием PhoneNumberUtil::getRegionCodeForNumber() ).

В качестве бонуса библиотека может обрабатывать практически любой ввод. Если вы, например, решите запустить 1-800-JETBLUE приведенный выше код, вы получите

Вот мое решение для США, с кодом области в качестве необязательного компонента, обязательным разделителем для расширения и комментариями к регулярному выражению:

А вот сценарий для проверки:

Вот простая функция для форматирования телефонных номеров от 7 до 10 цифр в более европейской (или шведской?) Манере:

Не изобретайте велосипед! Импортируйте эту удивительную библиотеку:
https://github.com/giggsey/libphonenumber-for-php

Он основан на библиотеке Google для анализа, форматирования и проверки международных телефонных номеров: https://github.com/google/libphonenumber

Я вижу, что это возможно, используя либо какое-то регулярное выражение, либо несколько вызовов substr (при условии, что ввод всегда имеет этот формат и не меняет длину и т. Д.)

должен это сделать.

Это быстрее, чем RegEx.

Попробуйте что-нибудь вроде:

Думаю, я исправил. Работаем с текущими входными файлами и выполняем следующие 2 функции!

функция format_phone_number:

функция validate_phone_number:

Заметьте, у меня это есть в классе lib, поэтому вызов self :: validate_phone_number из первой функции / метода.

Обратите внимание на строку № 32 функции «validate_phone_number», где я добавил:

чтобы получить ложный возврат, если не действительный номер телефона.

Все еще нужно проверить это на большем количестве данных, но работаю с текущими данными, с текущим форматом, и я использую стиль «8» для этого конкретного пакета данных.

Также я прокомментировал логику «расширения», поскольку я постоянно получал от нее ошибки, видя, что у меня нет такой информации в моих данных.

это занимает 7, 10 и 11 цифр, удаляет дополнительные символы и добавляет тире, перемещаясь справа налево по строке. замените тире на пробел или точку.

Я использовал аналогичную функцию для форматирования номеров телефонов в Австралии.

Обратите внимание, что с точки зрения хранения номера телефона:

Телефонные Форматы Соединенного Королевства

Для приложения, которое я разработал, я обнаружил, что люди вводили свой номер телефона «правильно» в удобочитаемой форме, но вставляли различные случайные символы, такие как «-» / «+44» и т. Д. Проблема заключалась в том, что облачное приложение, которое нужно было поговорить с довольно конкретным о формате. Вместо того, чтобы использовать регулярное выражение (что может расстраивать пользователя), я создал класс объекта, который обрабатывает введенное число в правильный формат перед обработкой модулем постоянства.

Формат вывода гарантирует, что любое принимающее программное обеспечение интерпретирует вывод как текст, а не целое число (которое тогда сразу потеряет начальный ноль), а формат соответствует British Telecoms рекомендации по форматированию чисел, которые также помогают запоминать человека, разделяя длинное число на небольшие, легко запоминающиеся группы.

+441234567890 производит (01234) 567 890
02012345678 производит (020) 1234 5678
1923123456 производит (01923) 123 456
01923123456 производит (01923) 123 456
01923 hello this is text123456 производит (01923) 123 456

Я уверен, что есть более эффективные решения, но это оказалось чрезвычайно надежным. Можно легко разместить больше форматов, добавив в конце функцию teleNum.

Процедура вызывается из вызывающего скрипта таким образом

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *