Регулярное выражение для забора номера телефона

RuslanAliev

Client
Регистрация
24.03.2015
Сообщения
45
Благодарностей
5
Баллы
8
Уважаемые участники и гости форума!
Могли бы подсказать универсальное регулярное выражение, которое бы забирало номер телефона в независимости от его формата, т.е., например, встречаются номера +7 (ххх)ххххххх , 8хххххххххх, +7 (ххх)-ххх-хх-хх и т.д.
Заранее благодарен за любой совет и помощь!
 

RuslanAliev

Client
Регистрация
24.03.2015
Сообщения
45
Благодарностей
5
Баллы
8
Например, существует регулярка для даты - (\d{1,2}\/\d{1,2}\/\d{4}) - Дата (напр.,21/3/2006).
С небольшими изменениями можно использовать везде. Возможно ли сделать или может у кого-то имеется готовое решение для забора номера телефона?
 
  • Спасибо
Реакции: xopek2007

RuslanAliev

Client
Регистрация
24.03.2015
Сообщения
45
Благодарностей
5
Баллы
8
Подсказали решение - немного переделал под свои нужды: может кому-то пригодиться:
1. Парсим текст содержащий номер телефона (я делал через DOM модель,, поэтому осталось куча html тегов, но это не важно так как на итоге хорошо забирает номер телефона)
2. Приводим спарсенный текст с номером телефона к единообразию - обработка текста=>замена=>({-String.Enter-}|{-String.Space-}|{-String.Tab-}|\(|\)|\-|\+) на пустоту.
3. Вычленяем номер телефона регуляркой - (8|\+7|7)[0-9]{7,10}

Актуально для российских стационарных и мобильных телефонов.
Может у кого-то имеется решение поизящнее - буду рад увидеть.
 

Вложения

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 452
Благодарностей
1 886
Баллы
113
Такой метод работает только для конкретного сайта, где номер телефона находится где то в одном месте и можно получить блок, содержащий номер. Т.е., когда Вам не нужно обрабатывать всю страницу сайта.
На самом деле, правильно выбрать номера телефона - это очень сложная задача и в плане написания решения и в плане дальнейшего его выполнения компьютером и одной регулярки тут будет недостаточно.
Я делал сбор номеров. Но начиналось это всё с того, что шаблону нужно дать нужные коды, которые надо искать, исходя из этого, проходя множество проверок и фильтров отбирались номера. Но даже при этом не со всех сайтов номера получались корректными, хотя процент был большой.
 

nuzypeqi

Новичок
Регистрация
28.12.2018
Сообщения
12
Благодарностей
0
Баллы
1
Например, существует регулярка для даты - (\d{1,2}\/\d{1,2}\/\d{4}) - Дата (напр.,21/3/2006).
С небольшими изменениями можно использовать везде. Возможно ли сделать или может у кого-то имеется готовое решение для забора номера телефона?
Помогите подобрать регулярку чтоб парсить номера, так чуть подобрал, а как дальше ? Не получается (\+|)(38|)(\ |)\((067|068|096|097|098|050|066|095|099|063|073|093).*?(?=(<|,|"|&|й|ц|у|к|е|н|г|ш|щ|щ|з|х|ф|ы|в|а|п|р|о|л|д|ж|э|я|ч|с|м|и|т|б|ю|Й|Ц|У|К|Е|НГ|Ш|Щ|З|Х|Ф|Ы|В|А|П|Р|О|Л|Д|Ж|Э|Я|Ч|С|М|И|Т|Ь|Б|Ю))

так подобные номера дергает
Код:
<span>+38 (093) 367-49-07</span></span>
>+38(093) 367-49-07<
>(093) 367-49-07<
а как сделать чтоб дергало рукой словно, качественно грабило с большого обьема при парсинге методом зайца с большого объема страниц ? Нужно красть много номеров телефонов с разных сайтов, хочется сделать совместно качественное производство по сбору телефоном, отточенными регуярными выражениями. Чтоб куча кубиков было отменной рабочей фабрикой по добыче цифр контактов. В ручную хорошо, но нужно быстро, качественно машинно для больших объемных обработок
 
Последнее редактирование:

nuzypeqi

Новичок
Регистрация
28.12.2018
Сообщения
12
Благодарностей
0
Баллы
1
( |)[0-9][0-9][0-9](-| |)[0-9][0-9](-| |)[0-9][0-9] - так не выходит чего-то
 

nuzypeqi

Новичок
Регистрация
28.12.2018
Сообщения
12
Благодарностей
0
Баллы
1
Вот кое-что вышло, дергал, дергал, на дергал нужных выражений, вот кому может пригадиться тоже по дергать номеров (\+|)(38|)(\ |)\((067|068|096|097|098|050|066|095|099|063|073|093)\)(\-|\ |)(\d{3}(\-|\ |)\d\d(\-|\ |)\d\d)(?=(<|,|"|&|й|ц|у|к|е|н|г|ш|щ|щ|з|х|ф|ы|в|а|п|р|о|л|д|ж|э|я|ч|с|м|и|т|б|ю|Й|Ц|У|К|Е|НГ|Ш|Щ|З|Х|Ф|Ы|В|А|П|Р|О|Л|Д|Ж|Э|Я|Ч|С|М|И|Т|Ь|Б|Ю)), там в процессе соксы тунилированные носки регулярно дергать любые будут замечательно данных объемов кучи, регулярка хороша, там дальше главное подключение и массовый метод зайца, ништяк будет
 

nuzypeqi

Новичок
Регистрация
28.12.2018
Сообщения
12
Благодарностей
0
Баллы
1
Вот еще чуть под исправил, еще лучше вышло 38 - стандарт цифр пеерд оператором, из трех цифр с нуля начинающеся - сотовые операторы Украины, а там по сути можно только операторов менять и под многие телефоны подойдет
(\+|)(38|)(\ |)(\(|)(067|068|096|097|098|050|066|095|099|063|073|093)(|\))(\-|\ |)(\d{3}(\-|\ |)\d\d(\-|\ |)\d\d)(\ |\ \ |\ \ \ |)(?=(<|,|"|&|й|ц|у|к|е|н|г|ш|щ|щ|з|х|ф|ы|в|а|п|р|о|л|д|ж|э|я|ч|с|м|и|т|б|ю|Й|Ц|У|К|Е|НГ|Ш|Щ|З|Х|Ф|Ы|В|А|П|Р|О|Л|Д|Ж|Э|Я|Ч|С|М|И|Т|Ь|Б|Ю))
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
епать моё удалили а регулярка которая предоставлена куй пойми как в посте, так удалите её тоже на хрен, или ты чувак оформи чтобы людям приятно было понять а самое главное понять
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
тупая регулярка, 21 век, сейчас намного проще, а вот теперь в гугл иди, но такой колбасой пользоваться но это ужас )
я тоже такое предлагал так это было и не правда )
 

Master4eg

Client
Регистрация
06.04.2016
Сообщения
421
Благодарностей
123
Баллы
43
епать моё удалили а регулярка которая предоставлена куй пойми как в посте, так удалите её тоже на хрен, или ты чувак оформи чтобы людям приятно было понять а самое главное понять
Можешь скинуть?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
Есть у меня пару регулярок для телефонов. Писал их для сайта. Где номера как попало пишут с тире, пробелами, скобками. В общем треш оттуда парсить.

Сначала простой регуляркой пробуем собрать
Код:
(\+7|\+37)\d{9,11}
Потом вот такой, для треша)) (не финальная версия, можно доработать)
Код:
(\+7|8|\+37|\+38)(\ |-|)(\(|)\d{3,4}(\)|)(\ |-|)\d{2,3}(\ |-)(\d{2,3}(\ |-)\d{1,3}|\d{4})
 
  • Спасибо
Реакции: eee, Ikigai и art22

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Телефоны пишут по разному, могут и не на одной строке, и обернуть в html теги.
Самый универсальный способ через регулярки - это собирать все числа на странице идущие подряд в диапазоне от до \d{9,11}
После их перепроверить, откидывая лишнее, удобнее всего это делать через порт библиотеки гугла для обработки телефонов - libphonenumber на C#, внутри там тоже регулярные выражения, но уже проработаны для каждой страны отдельно.

Готовый шаблон, для вытаскивания телефонов на основе этой библиотеки
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
Самый универсальный способ через регулярки - это собирать все числа на странице идущие подряд в диапазоне от до \d{9,11}
В каком месте он универсальный. Назовем это самый простой и не эффективный. Номера могут быть написанны как угодно. Конечно все зависит от сайта. Лучший вариант собрать 20-30 номеров вручную и посмотреть какая регулярка соберет больше номеров.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
В каком месте он универсальный.
Почему не эффективный, очень даже, эффективный сбор данных. Тестировался на ~ 100 тыс сайтов.
Номера могут быть для России указаны как +7 8 9 47 (код города), когда проходишь по тематике, полнота важна.
Это на примерах нескольких сайтах все работает отлично, на живых сайтах "поле чудес".

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

Алгоритм:
  1. Собираем все последовательности из чисел от и до.
  2. Прогоняем каждый из номеров методами possible и validate, через libphonenumber
  3. Валидные, добавляем в базу.

Преимущества:
  • Качество
  • Обновляют за нас (пока обновляют)

Недостатки:
  • Скорость ниже, одно регулярное выражения отрабатывает быстро, тут циклы для каждого номера, но номеров не много обычно собирается.
  • 5 и 6 знаки, не собирает, регулярку можно подогнать, тут нужно думать.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
Многие пишут номера через дефис, с пробелами и даже скобаками. По этому ваша регулярка не может быть универсальной уже изначально. Может она парсит много, но сколько номеров проходит мимо можно только гадать.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Многие пишут номера через дефис, с пробелами и даже скобаками
Похоже я изначально не совсем правильно написал, извиняюсь. Имелось ввиду что ищется последовательность цифр без этих символов.

Рабочие регулярки примерно такие, это из черновиков под рф, во время разработки, питон:
Код:
phone_pat = r'([0-9-\+\(\ )]{6,10})' # много мусора, в html расстояние может быть больше
phone_pat = r'([78\+\(](?:[-()]*[0-9 ]){6,10})' # много мусора, находит все
phone_pat = r'([78\+\(](?:[-()]*[0-9 ]){5,15})'
Итоговая отличалась от этих, но доступа к проекту сейчас нет, где-то на сервере остался. Т.к. потом на библиотеку перешел.
 
Последнее редактирование:

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
В том то и дело, чем более универсальная регулярка, тем больше мусора. А мусор парсить очень не хочется, и пытаешься найти золотую середину.

Есть сайты где телефон всегда в одном месте, между тегами telehpone или что-то подобное, тут конечно все идеально. А вот сайты где номера раскиданы по всему коду. Тут начинается импровизация))
 
  • Спасибо
Реакции: specialist

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
А мусор парсить очень не хочется, и пытаешься найти золотую середину.
Кроме мусора, там много еще интересного, например, телефоны разработчиков скриптов или inline css и комментарии, их тоже лучше вырезать, но это уже особенности обработки.

Если номера не перепроверять, то +7 (000) 000-00-00 тоже попадет, но его не может быть, согласно правилам, перепроверять обязательно, если для работы.
Сайтов в вечной разработке, тоже достаточно.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
Кроме мусора, там много еще интересного, например, телефоны разработчиков скриптов или inline css и комментарии, их тоже лучше вырезать, но это уже особенности обработки.

Если номера не перепроверять, то +7 (000) 000-00-00 тоже попадет, но его не может быть, согласно правилам, перепроверять обязательно, если для работы.
Сайтов в вечной разработке, тоже достаточно.
В данный момент я оптимизирую один парсер, и проверяю номера вручную которые регулярка не взяла, вот такой треш попался))

n8(912)726\u20139412

В данном случае я принял решение сделать замену \u2013 на дефис. Чем городить треш в регулярке)
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
сделать замену \u2013 на дефис. Чем городить треш в регулярке)
Не могли бы в личку или под хайдом сайт написать? Стало интересно, смогу получить данные или нет, теми вариантами, что у меня.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
В данный момент я оптимизирую один парсер, и проверяю номера вручную которые регулярка не взяла, вот такой треш попался))

n8(912)726\u20139412

В данном случае я принял решение сделать замену \u2013 на дефис. Чем городить треш в регулярке)
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
Ну это длинный девис (не понимаю зачем его используют, может защита от парсеров такая), так или иначе лучше сделать замену, чем в регулярку пихать лишние символы.
 

Ikigai

Client
Регистрация
13.12.2016
Сообщения
276
Благодарностей
27
Баллы
28
C#:
RU nums
((^\+|^)(7|8)\d{10}\:)|(^9\d{9}\:)
---- Intext RU NUMS
        ((\+|)(7|8)\d{10})|(9\d{9})
--- BY numbers
(\+)?(375)?(\s|\(|\-)?((2|3|4)(3|4|5|9))(\s|\)|\-)?\d{3,7}((\s|\-)?\d{2,4}(\s|\-)?\d{2})(;|:|\s+|\|)\w+
Так нашлось в итоге иделаьное решение для регулярки ? А если разные страны?
В телеге видел эти, но опять же, нет для украины
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113
C#:
RU nums
((^\+|^)(7|8)\d{10}\:)|(^9\d{9}\:)
---- Intext RU NUMS
        ((\+|)(7|8)\d{10})|(9\d{9})
--- BY numbers
(\+)?(375)?(\s|\(|\-)?((2|3|4)(3|4|5|9))(\s|\)|\-)?\d{3,7}((\s|\-)?\d{2,4}(\s|\-)?\d{2})(;|:|\s+|\|)\w+
Так нашлось в итоге иделаьное решение для регулярки ? А если разные страны?
В телеге видел эти, но опять же, нет для украины
Посмотри тут, вобще огонь тема. По поводу разных стран не уверен, но там гео менять можно. Может можно как то на все гео чекать, это лучше спросить у автора.
 

Ikigai

Client
Регистрация
13.12.2016
Сообщения
276
Благодарностей
27
Баллы
28
Есть у меня пару регулярок для телефонов. Писал их для сайта. Где номера как попало пишут с тире, пробелами, скобками. В общем треш оттуда парсить.

Сначала простой регуляркой пробуем собрать
Код:
(\+7|\+37)\d{9,11}
Потом вот такой, для треша)) (не финальная версия, можно доработать)
Код:
(\+7|8|\+37|\+38)(\ |-|)(\(|)\d{3,4}(\)|)(\ |-|)\d{2,3}(\ |-)(\d{2,3}(\ |-)\d{1,3}|\d{4})
Крутая регулярка верхняя. Немного добавил .

Код:
(8|\+7|\+37|\+380)\d{9,11}
0
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 440
Благодарностей
5 459
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)