Регулярные выражения и номер телефона
Создано: Июль 11th, 2011 | Автор: unknow | Рубрика: php | Теги: php, скрипт | Нет комментариев »Вчера столкнулся с задачей спарсить базу сотовых телефонных номеров с сайта бесплатных объявлений. Нашел парсер, указал границы и получил кучу мусора…В контактных данных с сайта были имена, домашние номера телефона, просьбы звонить вечером и т.п. Да еще и сами сотовые номера в разных форматах! Вобщем, после нескольких неудачных попыток найти что-то готовое в нете я решил сам написать оброботчик файлов с данными.
Помогают решить проблему регулярные выражения! Из всего мусора данных скрипт находит номера сотовых и приводит к одному виду:
include("config.php"); $count = 0; //будем считать номера телефонов $f = 1; //счетчик для файлов do { $file = ("gg/article_all_".$f.".txt"); if (!is_file($file)) break; $massive = (file($file)); //загоняем данные из файла в массив $i = 0; //счетчик для перебора элементов массива //самая важная строчка: $mask = "/(\+7|8)(\d+|-|\d{3}-)(\d{3})(-\d{3}|-\d{2}|\d+)(-\d{4}|-\d{2}-\d{2}|-\d{2}|\d{2}-\d{2}|\d{2,4})/"; do { preg_match_all($mask, $massive[$i], $phones, PREG_PATTERN_ORDER); //ищем все совпадения и загоняем их в массив $phones $n = 0; //счетчик для перебора массива с совпадениями do { if (preg_match($mask, $phones[0][$n])) //счейчас задумался, а нужно ли это условие? { $phone = str_replace("-","",$phones[0][$n]); //убираем дефисы из номера телефона $phone = str_replace("+7","8",$phone); //+7 меняем на 8 $result = mysql_query("SELECT id FROM phonebook WHERE phone='$phone'"); $num = mysql_num_rows($result); //проверяем нет ли такого номера у нас в БД: if ($num == 0) mysql_query ("INSERT INTO phonebook (phone) VALUES ('$phone')"); $n++; $count++; } } while (preg_match($mask, $phones[0][$n])); $i++; } while (!empty($massive[$i])); $f++; } while (is_file($file)); $result = mysql_query("SELECT phone FROM phonebook ORDER BY phone"); $phonebook = mysql_fetch_array($result); do //выводим сортируя по возрастанию { echo $phonebook["phone"].' '; } while ($phonebook = mysql_fetch_array($result));
Скрипт писал поздно вечером, в нем могут быть ошибки, так же вероятно можно записать маску как-то проще — это мой первый опыт с регулярками… Если у кого есть желание доработать буду только рад!
С задачей скрипт справляется: находит сотовые номера среди прочих и текста. Старался заложить в маске все возможные варианты написания номера:
89103213232
8-9103213232
8-910-3213232
8-910-321-3232
8-910-321-32-32
891032132-32
8910321-32-32
8910-332-32-32
8-910-32132-32
8910-32132-32
8910-3213232
8910321-3232
8910321-32-32
П.С.: парсер — content downloader; онлайн генератор регулярок в помощь:
Отличный сайт бесплатных объявлений:
Оставить ответ