Я работаю над приложением SMS, и мне нужно иметь возможность преобразовать номер телефона отправителя с +11234567890 в 123-456-7890, чтобы его можно было сравнить с записями в базе данных MySQL .
Числа хранятся в последнем формате для использования в других местах на сайте, и я бы предпочел не менять этот формат, поскольку это потребует изменения большого количества кода.
Как мне это сделать с помощью PHP?
Спасибо!
php
phone-number
Ночное отделение интенсивной терапии
источник
источник
Ответы:
источник
sprintf
или printf? Кто-нибудь, пожалуйста, объясните мне. Я работаю только с телефонными номерами в США и не думаю, что запуск их через функцию вывода с использованием подстроки - лучший метод.Это форматировщик телефонов в США, который работает с большим количеством версий чисел, чем любой из текущих ответов.
А вот разбивка регулярного выражения:
Обновлено: 11 марта 2015 г. для использования
{0,7}
вместо{,7}
источник
~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~
.(\d{3}) // 3 digits
[\d]
// символ, который не является цифрой{,7}
обновить{0,7}
. Я обновил код.Эта функция форматирует международные (10+ цифр), немеждународные (10-значные) или старые (7-значные) телефонные номера. Любые числа, кроме 10+, 10 или 7 цифр, останутся неформатированными.
источник
Предполагая, что ваши номера телефонов всегда имеют именно такой формат, вы можете использовать этот фрагмент:
источник
С телефонными номерами сложно. Для более надежного международного решения я бы порекомендовал этот хорошо поддерживаемый порт PHP библиотеки Google libphonenumber .
Используя это так,
вы получите следующий результат:
Я бы рекомендовал использовать этот
E164
формат для повторяющихся проверок. Вы также можете проверить, действительно ли это номер мобильного телефона (с использованиемPhoneNumberUtil::getNumberType()
) или даже номер в США (с использованиемPhoneNumberUtil::getRegionCodeForNumber()
).В качестве бонуса библиотека может обрабатывать практически любой ввод. Если вы, например, решите запустить
1-800-JETBLUE
приведенный выше код, вы получитеNeato.
Это работает так же хорошо для других стран, кроме США. Просто используйте в качестве
parse()
аргумента другой код страны ISO .источник
number_formatted
столбец в свою базу данных и вручную ввести отформатированные номера. Тем не менее, все еще использоватьlibphonenumber
локально для генерации форматированных чисел, но включение такой огромной библиотеки для моего небольшого проекта просто излишне.Вот мое решение для США, с кодом области в качестве необязательного компонента, обязательным разделителем для расширения и комментариями к регулярному выражению:
А вот сценарий для проверки:
источник
Вот простая функция для форматирования телефонных номеров от 7 до 10 цифр в более европейской (или шведской?) Манере:
источник
Не изобретайте велосипед! Импортируйте эту удивительную библиотеку:
https://github.com/giggsey/libphonenumber-for-php
Он основан на библиотеке Google для анализа, форматирования и проверки международных телефонных номеров: https://github.com/google/libphonenumber
источник
Я вижу, что это возможно, используя либо какое-то регулярное выражение, либо несколько вызовов substr (при условии, что ввод всегда имеет этот формат и не меняет длину и т. Д.)
что-то вроде
должен это сделать.
источник
Это быстрее, чем RegEx.
источник
Попробуйте что-нибудь вроде:
для этого потребуется $ number
8881112222
и преобразовать в888-111-2222
. Надеюсь это поможет.источник
'.'
также должен быть обновлен'-'
или удален. Он был включен из-за конкретного случая использования - с очень небольшими усилиями вы могли преобразовать егоpreg_replace('/\d{3}/', '$0-', substr($number, 2))
и напрямую ответить на вопрос.Другой вариант - легко обновить, чтобы получить формат из конфигурации.
источник
Все,
Думаю, я исправил. Работаем с текущими входными файлами и выполняем следующие 2 функции!
функция format_phone_number:
функция validate_phone_number:
Заметьте, у меня это есть в классе lib, поэтому вызов self :: validate_phone_number из первой функции / метода.
Обратите внимание на строку № 32 функции «validate_phone_number», где я добавил:
чтобы получить ложный возврат, если не действительный номер телефона.
Все еще нужно проверить это на большем количестве данных, но работаю с текущими данными, с текущим форматом, и я использую стиль «8» для этого конкретного пакета данных.
Также я прокомментировал логику «расширения», поскольку я постоянно получал от нее ошибки, видя, что у меня нет такой информации в моих данных.
источник
это занимает 7, 10 и 11 цифр, удаляет дополнительные символы и добавляет тире, перемещаясь справа налево по строке. замените тире на пробел или точку.
источник
Я знаю, что OP запрашивает формат 123-456-7890, но, основываясь на ответе Джона Дула , я изменил его, чтобы вернуть номер телефона в формате круглых скобок, например (123) 456-7890. Этот обрабатывает только 7- и 10-значные числа.
источник
Вот мой вывод:
sscanf
Функция принимает в качестве второго параметра в строку формата , говоря ему , как интерпретировать символы из первой строки. В данном случае это означает 2 символа (%2c
), 3 символа, 3 символа, 4 символа.Обычно
sscanf
функция также включает переменные для сбора извлеченных данных. Если нет, данные возвращаются в массиве, который я вызвал$parts
.print
Оператор выводит интерполированную строку.$part[0]
игнорируется.Я использовал аналогичную функцию для форматирования номеров телефонов в Австралии.
Обратите внимание, что с точки зрения хранения номера телефона:
источник
Телефонные Форматы Соединенного Королевства
Для приложения, которое я разработал, я обнаружил, что люди вводили свой номер телефона «правильно» в удобочитаемой форме, но вставляли различные случайные символы, такие как «-» / «+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
Значение сегмента обмена номера - в скобках - заключается в том, что в Великобритании и большинстве других стран вызовы между номерами в одной и той же телефонной станции могут осуществляться без сегмента обмена. Однако это не относится к телефонным номерам серий 07, 08 и 09.
Я уверен, что есть более эффективные решения, но это оказалось чрезвычайно надежным. Можно легко разместить больше форматов, добавив в конце функцию teleNum.
Процедура вызывается из вызывающего скрипта таким образом
`
источник
Это для стационарных телефонов Великобритании без кода страны.
Результат:
источник
Взгляните на функцию на основе substr, которая может изменять форматы
источник
Проверить номер телефона
источник