Фильтрация операторов по ip диаппазонам

<?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 ;)
*/