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

Форматирование телефонных номеров в 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.

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

Источник

Форматирование телефонных номеров на 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 Готовятся поправки:

Источник

Форматирование телефонных номеров на 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 секунды.

Источник

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

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