Задать вопрос
@Richard_Ferlow
Веб-программист

Есть ли способ сделать «универсальное» решение для поиска телефона в тексте?

В регулярных очень плохо разбираюсь, не знаю насколько это выполнимо.
Задача такая, что с разных источников на e-mail поступают заявки и в них так или иначе указан номер телефона.
Телефон может быть по разному записан, через +7 через 8, со скобками, с тире, с пробелами.

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

может быть какой-то универсальный инструмент есть, просто я его найти не могу.
с уже имеющимися номерами работаю с помощью https://github.com/giggsey/libphonenumber-for-php - удобная штука, на мой взгляд.
  • Вопрос задан
  • 2672 просмотра
Подписаться 3 Оценить 1 комментарий
Решения вопроса 1
@xxxKNxxx
Молодец
Есть готовый класс для генерации регулярнки и поиску номеров для выбранной страны в тексте.
Базируется как раз на giggsey/libphonenumber-for-php .
Инструкция
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@komandakycto
php программист
Вы себе сильно усложнили задачу допустив вольность в формате номера телефона. Есть общепринятый формат +7.
Пишите регулярки под каждый формат и вытаскивайте. Задача выполнимая на мой взгляд.
Ответ написан
Я бы сделал так: проверял бы номер телефона несколькими регулярками (или объединил бы регулярки для каждого формата в одну). Перед этим - удалить все возможные лишние и оформляющие символы (пробелы, дефисы, скобки, и т.п.), чтобы облегчить задачу и свести число регулярок к минимуму. Если есть текст - можно, например, вернуть ошибку \ исключение (тк. скорее всего это даже и не совсем телефон). По сути, вам нужно любой ценой минимизировать количество вариантов, и приводить их к одной форме.

Также можно проверять перед регулярками телефон на длину: если строка длиной менее 11 символов, то скорее всего она записана без 8 \ +7 в начале, и этот префикс стоит добавить, чтобы телефон прошел регулярку (или вернуть ошибку).

Возможно, это костыльное решение и есть лучшее.
Ответ написан
Комментировать
@whats
Первым делом из текста нужно исключить все специальные символы и сделать все 1 строкой.
Делается это 1 регуляркой
.replace(/[\W_]*/g,'')
далее мы должны искать в тексте числовые последовательности содержащие от 6 до 11 цифр.
'@$fr e+7(911)123-2131f_ () f23'.replace(/[\W_]*/g,'').replace(/[\w]*?([\d]{6,12})[\w]*/,"$1")

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

Я в своей системе заменяю по функции, и вывожу результат регулярки, рядом вывожу чистую подстроку в которой встречается телефон, по которой операторы могут глазами понять а тот ли это телефон и как он был записан.
Ответ написан
Комментировать
stas_agarkov
@stas_agarkov
Я программист
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы