Детектирование номеров телефонов в тексте.

Solmyr
На сайте с 10.09.2007
Offline
501
627

С одной стороны хочу поделится свой наработкой:

preg_match_all("/[0-9 \(\)\-\+]{2,16}[0-9\- ]{2,}[0-9]{2,}/is",$text,$matches);

С другой стороны обнаружил, что не работает в случаях:

- если в тексте несколько телефонов подряд через пробел.

- если после телефона указано время когда звонить.

Есть ли у кого-нибудь другие алгоритмы?

P
На сайте с 08.03.2007
Offline
250
#1

А он детектирует как номер телефона конструкцию ниже ?

8-) (800)-008 8-) или 8-) (800)-(008) 0000
malls
На сайте с 08.08.2005
Offline
255
#2

Ну если годы Вашего труда ушли на данную наработку - то конечно это достойно записи в анналах... А "по жизни" любой програмер ту же конструкцию пишет как дважды-два, причем более корректно и избирательно...

[Удален]
#3

я бы остановился на этом :)

preg_match_all("/\\+?[\\(\\)0-9 ]{9,}/is",$text,$matches);

ибо все не отловишь, а это может схавать чуток побольше номеров, ну может и не только номера :)

Solmyr
На сайте с 10.09.2007
Offline
501
#4
malls:
Ну если годы Вашего труда ушли на данную наработку - то конечно это достойно записи в анналах

Сударь шутник?

malls:
А "по жизни" любой програмер ту же конструкцию пишет как дважды-два, причем более корректно и избирательно...

А что-то поконкретнее общих слов вы по теме сказать можете?

bearman:
я бы остановился на этом

preg_match_all("/\\+?[\\(\\)0-9 ]{9,}/is",$text,$matches);

ибо все не отловишь, а это может схавать чуток побольше номеров, ну может и не только номера

Собственно проблема в том, что первое и так хавает слишком много. А этот вариант схавает еще больше мусора.

[Удален]
#5
Solmyr:
Сударь шутник?

А что-то поконкретнее общих слов вы по теме сказать можете?

Собственно проблема в том, что первое и так хавает слишком много. А этот вариант схавает еще больше мусора.

покажи пример телефоном, которые тебе надо отфильтровать.

Solmyr
На сайте с 10.09.2007
Offline
501
#6
bearman:
покажи пример телефоном, которые тебе надо отфильтровать.

Пасибо, я уже написал вот так:

$sph = array();

$lph = array();

$code = array();

$sph[] = "[0-9]{2}\-[0-9]{2}\-[0-9]{2}\b";

$sph[] = "[0-9]{2} [0-9]{2} [0-9]{2}\b";

$sph[] = "[0-9]{3}\-[0-9]{3}\b";

$sph[] = "[0-9]{3} [0-9]{3}\b";

$sph[] = "[0-9]{6}\b";

$lph[] = "[0-9]{3}\-[0-9]{2}\-[0-9]{2}\b";

$lph[] = "[0-9]{3} [0-9]{2} [0-9]{2}\b";

$lph[] = "[0-9]{3}\-[0-9]{4}\b";

$lph[] = "[0-9]{3} [0-9]{4}\b";

$lph[] = "[0-9]{7}\b";

$code[] = "8[\- ]{1}0[0-9]{2}[\- ]{1}";

$code[] = "8[0-9]{3}[\- ]{1}";

$code[] = "8[0-9]{3}";

preg_match_all("/(\b".implode("|\b",$sph).")[ \.,\Z]{1}/is",$text,$mt);

foreach($mt[0] as $mp){

$phonestrings[] = $mp;

}

preg_match_all("/(\b".implode("|\b",$lph).")[ \.,\Z]{1}/is",$text,$mt);

foreach($mt[0] as $mp){

$phonestrings[] = $mp;

}

preg_match_all("/(\b".implode("|\b",$code).")(".implode("|",$lph).")[ \.,\Z]{1}/is",$text,$mt);

foreach($mt[0] as $mp){

$phonestrings[] = $mp;

}

Вроде работает. Не ловит только телефоны из районных центров с длинными кодами и короткими номерами.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий