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