<?php /** * Фильтрация операторов по ip диаппазонам * автор: Nc_Soft * 13.05.10 */ /* Часто возникает задача фильтровать трафик в зависимости от оператора. Можно хранить диаппазоны в базе данных и выбирать оттуда, но для их редактирования надо либо писать некую админку, либо залазить в phpmyadmin или в подобные вещи. Предлагаю простенький фильтр, который можно легко и гибко редактировать, задавая как диаппазоны, так и одиночные ип адреса. Причем, абсолютно не важен формат записи, главное чтобы присутствовал ип адрес. Это позволяет простым копипастом вставлять диаппазоны. Главное условие - не более 2 ип адресов в строке. Для примера задаю для мтс и билайна. */ //замеряем скорость (об этом ниже) define('START_TIME',microtime(true)); //функция фильтра, в ней можно редактировать ип адреса function traf_filter($ip) { $opsos = array( 'beeline' => ' --- ниже можно редактировать --- [217.118.66.0 - 217.118.66.255] //GPRS Core Москва [217.118.81.0 - 217.118.81.255] //GPRS Core Ростов-на-Дону [217.118.78.0 - 217.118.78.255] //GPRS Core Санкт-Петербург [217.118.79.0 - 217.118.79.255] //GPRS Core Новосибирск [217.118.91.0 - 217.118.91.255] //GPRS Core Екатеринбург [217.118.90.0 - 217.118.90.255] //GPRS Core Саратов [217.118.64.0 - 217.118.64.255] //GPRS Core Хабаровск [217.118.82.0 - 217.118.82.255] //GPRS Core Ставрополь [217.118.83.0 - 217.118.83.255] //GPRS Core Челябинск [217.118.93.0 - 217.118.93.255] //GPRS Core Н.Новгород [217.118.92.0 - 217.118.92.255] //GPRS Core Череповец [217.118.95.0 - 217.118.95.255] //GPRS Core Воронеж [213.252.195.0 - 213.252.195.255] //GPRS Core Калининград [83.220.227.0 - 83.220.227.255] //GPRS Core Самара [217.118.89.0 - 217.118.89.255] //GPRS Core Сахалин [85.115.243.32 - 85.115.243.63] //GPRS Core Иркутск Beeline (WAP) - [217.118.85.64 - 217.118.85.79] --- выше можно редактировать ---', 'mts' => ' --- ниже можно редактировать --- 194.54.148.8 213.87.6.8 217.8.235.194 217.8.236.11 217.74.244.13 217.66.145.10 217.66.145.15 213.87.72.73 213.87.72.87 212.92.139.198 195.74.84.32 80.83.238.246 80.83.238.247 80.83.232.0 - 80.83.233.255 80.83.228.0 - 80.83.231.255 80.83.238.0 - 80.83.238.255 80.83.239.1 - 80.83.239.12 84.17.254.0 - 84.17.255.255 95.153.191.0 - 95.153.191.255 195.22.110.0 - 195.22.110.255 195.74.84.36 - 195.74.84.47 195.74.84.74 195.74.84.128 - 195.74.84.223 195.85.238.168 - 195.85.238.223 213.87.8.0 - 213.87.15.255 213.87.64.0 - 213.87.64.63 213.87.64.128 - 213.87.64.255 213.87.76.128 - 213.87.76.255 213.87.77.0 - 213.87.77.255 213.87.80.0 - 213.87.81.255 213.87.82.0 - 213.87.85.255 213.87.86.160 - 213.87.86.195 213.87.87.0 - 213.87.88.255 213.87.89.0 - 213.87.90.255 213.87.92.0 - 213.87.95.255 215.66.146.1 - 215.66.146.32 217.8.225.0 - 217.8.225.255 217.8.226.0 - 217.8.227.255 217.8.228.0 - 217.8.229.255 217.8.230.0 - 217.8.231.255 217.8.232.0 - 217.8.233.255 217.8.234.0 - 217.8.234.255 217.8.236.0 - 217.8.236.255 217.8.239.0 - 217.8.239.255 217.66.146.1-217.66.146.99 217.66.147.0 - 217.66.147.255 217.74.249.0 - 217.74.251.255 217.74.247.128 - 217.74.247.191 217.74.244.128 - 217.74.244.255 217.74.245.0 - 217.74.245.255 217.74.248.0 - 217.74.248.255 217.74.247.192 - 217.74.247.223 --- выше можно редактировать --- ', ); //числовое представление экзаменуемого ип $ip = sprintf('%u', ip2long($ip)); //ищем оператора foreach ($opsos as $oper=>$v) { $s = explode("\n", trim($v)); foreach ($s as $p) { $arr = array(); //ищем ип адреса в строке preg_match_all('`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`', $p, $arr); if (!count($arr[0])) continue; $start = $arr[0][0]; //если ип адресов в строке 2, то это диаппазон $end = isset($arr[0][1]) ? $arr[0][1] : $start; //сверка if ($ip >= sprintf('%u', ip2long($start)) && $ip <= sprintf('%u', ip2long($end)) ) { return $oper; } } } //если ничего не найдено возвращаем пустоту return ; } //применение очень простое echo traf_filter('195.85.238.213'); //mts //ну и посмотрим сколько времени пахал скрипт printf('%.4f sec', microtime(true) - START_TIME); //~0.004 сек /* Любители оптимизации, конечно, могут меня пожурить, потому что используются регулярки, да еще и в цикле. Но ведь всегда можно применить кэширование этого массива + ставить куку тем, для кого уже определили оператора. p.s если вам понравился этот фильтр, то можете меня слегка отблагодарить R167883193132 ;) */