Оцениваем личное распределение абонентов по опсосам :)
В предверии вступления в силу закона об отмене мобильного рабства, многие абоненты задумываются о смене оператора. Подумываю об этом и я, ведь на МТС держит только 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 [12073 просмотра]