БлогNot. Оцениваем личное распределение абонентов по опсосам :)

Оцениваем личное распределение абонентов по опсосам :)

В предверии вступления в силу закона об отмене мобильного рабства, многие абоненты задумываются о смене оператора. Подумываю об этом и я, ведь на МТС держит только 11-летний номер. С другой стороны, поменять можно и "шило на мыло", ведь все отечественные опсосы примерно в одинаковой степени жуликоваты и склонны к спаму. Веским аргументом "за" или "против" смены оператора, пожалуй, может стать анализ своей абонентской базы - сколько людей из Ваших контактов на каком операторе "сидят". Ведь "внутрисеть" у всех бесплатна или очень дёшева.

Ясно, что считать вручную - долго и неудобно, проще быстро написать сервис на PHP. Мой "Андроид" умеет экспортировать контакты в текстовый файл формата .vcf, Ваш, надеюсь, тоже. Файл .vcf устроен довольно просто - по крайней мере, все записи о номерах телефонов располагаются в отдельных строках и начинаются одинаковыми префиксами:

TEL;HOME:+3833551010
TEL;CELL:+79139012345

Таким образом, для анализа файла .vcf мне хватило следующего небольшого "творения":

<!DOCTYPE html>
<html lang="ru">
<head>
 <meta charset="utf-8">
 <title>Телефоны</title>
</head>
<body>
<p><small>Вставьте содержимое файла .vcf в текстовое поле</small></p>
<?php 
 $data='';
 if (isset($_POST['data'])) $data = htmlspecialchars(trim($_POST['data']),ENT_QUOTES,'utf-8');
 if (!isset($_POST['submit'])) {
  echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">
   <textarea name="data" rows="25" cols="80" maxlength="300000">'.$data.'</textarea>
   <br>
   <input type="submit" name="submit" value="OK"></form>'."\n";
 } 
 else {
  $k=0;
  $array = explode ("\n",$data);
  $regexp = array (
   'МТС'=>"/((\+7|7|8)(91\d|98\d)(\d{7}))|(213\-?(\d{4}))/i",
   'Билайн'=>"/(\+7|7|8)(90\d|96\d)(\d{7})/i",
   'Мегафон'=>"/(\+7|7|8)(92\d)(\d{7})/i",
   'TELE2'=>"/(\+7|7|8)(95\d)(\d{7})/i",
   'Utel'=>"/(\+7|7|8)(99\d)(\d{7})/i",
   'Город'=>"/((\+7|7|8)(383|495)(\d{7}))|((\d{3})\-(\d{4}))|(\:\d{5})/i"
  );
  $regcnt = array (
   'Неизвестно'=>0, 'МТС'=>0, 'Билайн'=>0, 'Мегафон'=>0, 'TELE2'=>0, 'Utel'=>0, 'Город'=>0 
  );
  $unknown = array ();
  foreach ($array as $d) {
   $p=mb_stripos($d,"TEL;",0,'utf-8'); 
    //Сокращаем анализ - телефоны могут быть только в строке, начинающейся с "TEL;"
   if ($p!==0) continue;
   $found=false;
   foreach ($regexp as $key=>$value) {
    $res=preg_match($value,$d);
    if ($res===false) die ("Regexp error: ".$value);
    elseif ($res!==0) { $regcnt[$key]++; $k++; $found=true; break; }
   }
   if (!$found) {
    $regcnt['Неизвестно']++;
    $unknown[]=$d.'<br>';
   }
  }
  echo '<p>';
  reset($regcnt);
  foreach ($regcnt as $ckey=>$cvalue) {
   echo $ckey.': '.$cvalue.'<br>';
  }
  echo 'Всего опознано: '.$k.'</p>';
  echo '<p><form method="post" action="'.$_SERVER['PHP_SELF'].'">'.
   '<input type="hidden" name="data" value="'.$data.'">'.
   '<input type="submit" name="return" value="Вернуться"></form></p>'."\n";
  if ($regcnt['Неизвестно']>0) {
   echo '<p>Нераспознанные номера:</p>';
   print_r ($unknown);
  }
 }  
?>
</body></html>

Возможно, логичнее было бы описать шаблоны номеров по каждому оператору в массивах, вложенных в основной массив $regexp (а не по одному регулярному выражению на оператора), но это может замедлить выполнение кода, а файлы .vcf довольно велики. По тем же соображениям скрипт не возвращает данные назад в поле ввода по нажатию кнопки "Вернуться" (см. закомментаренную строку внизу листинга).

В версии, существующей на момент написания заметки, скрипт считает принадлежность номеров так:

  • МТС: федеральные номера на +7-91X-XXX-XX-XX, +7-98X-XXX-XX-XX, городские 213-XX-XX;
  • Билайн: федеральные номера на +7-96X-XXX-XX-XX, +7-90X-XXX-XX-XX;
  • Мегафон: федеральные номера на +7-92X-XXX-XX-XX;
  • TELE2: федеральные номера на +7-95X-XXX-XX-XX;
  • Utel (Ростелеком): федеральные номера на +7-99X-XXX-XX-XX;
  • Город: 7-значные номера с кодами 383, 495 (Новосибирск, Москва), 7-значные номера без кода города (мой Андроид пишет их в файле как XXX-XXXX), 5-значные номера без кода города (мой Андроид пишет их как XXXXX, так что регулярка начинается с двоеточия, номер всегда следует за строкой вроде TEL;HOME:).

Ясно, что это не всё, но мне хватило для достижения небольшой погрешности. Что не удалось распознать - показывается списком на экране результатов.

Работа онлайн-скрипта может меняться и пополняться новыми данными, если мне это понадобится.

Вот мои результаты, как видно, смена МТС на другого жулика опсоса может оказаться пока и неактуальна (с рассмотренной точки зрения; есть и другие соображения, конечно).

мои контакты по опсосам
мои контакты по опсосам

 Скрипт в работе

10.11.2013, 18:03 [12015 просмотров]


теги: личное статистика php форматы опсосы сервис android

К этой статье пока нет комментариев, Ваш будет первым