Чтобы знать о человеке многое, достаточно владеть немногим...

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

Создано: Июль 11th, 2011 | Автор: | Рубрика: 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; онлайн генератор регулярок в помощь:

Отличный сайт бесплатных объявлений:

Рассказать друзьям:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • MySpace
  • Одноклассники
Просмотров: 1 646


Оставить ответ