2.0.0.0/12 223; например 2.0.0.0/12 - это записан диапазон айпишников 37393408 - 37394431 - это тоже диапазон айпишников, но в другом формате как с формата 2.0.0.0/12 перевести в 37393408 - 37394431 средствами (стандартной может быть функцией)? как правильно назваются эти форматы?
А. http://php.net/ip2long обработай крайние айпишники - получишь диапазон. Только MSK это или RU естественно надо брать из готовых баз
Вот у меня что то эдакое получилось, оно? Метод "маск", высчитывает последний ип в диапазоне, что означают цифры после пробела - хз поэтому просто потёр. Код (Text): <?php $list = ' 2.0.0.0/12 223; 2.16.6.0/23 61; 2.16.68.0/23 234; 2.16.70.0/23 88; 2.16.132.0/23 61; 2.16.170.0/23 61; 2.16.172.0/23 61; 2.16.178.0/23 66; '; $list = explode(PHP_EOL,trim($list)); foreach($list as $str){ $str = DeleteAfter($str,' '); $ip = DeleteAfter($str,'/'); $mask = (int)DeleteBefore($str,'/'); $ip_start = ip2long($ip); $max = mask($ip,$mask); echo '<b>'.$ip.'</b> === '.long2ip($max).'<br/>'; echo $ip_start.' === '.$max.'<br/><br/>'; } function mask($ip,$mask){ $ip = ip2long($ip); $flag = 1; for($i=0;$i<$mask;$i++){ $ip = $ip | $flag; $flag <<= 1; //Двигаем биты } return $ip; } function DeleteAfter($str,$marker,$mode=false){ $pos = strpos($str,$marker); if($pos!==false) if($mode) return substr($str,0,$pos+strlen($marker)); else return substr($str,0,$pos); return $str; } function DeleteBefore($str,$marker,$mode=false){ $pos = strpos($str,$marker); if($pos!==false) if($mode) return substr($str,$pos); else return substr($str,$pos+strlen($marker)); return $str; }
Re: уверены что он правильно работает вот результат 2.0.0.0 === 2.0.15.255 33554432 === 33558527 2.16.6.0 === 2.127.255.255 34604544 === 41943039 2.16.68.0 === 2.127.255.255 34620416 === 41943039 2.16.70.0 === 2.127.255.255 34620928 === 41943039 2.16.132.0 === 2.127.255.255 34636800 === 41943039 2.16.170.0 === 2.127.255.255 34646528 === 41943039 2.16.172.0 === 2.127.255.255 34647040 === 41943039 2.16.178.0 === 2.127.255.255 34648576 === 41943039 все кроме первого концовка 41943039
inline, последняя цифра в "2.0.0.0/12 223" и есть регион или город. Если Вам надо только по России, то Вы не пробовали взять актуальную базу, например, на http://ipgeobase.ru/? DeleteAfter и DeleteBefore можно заменить на explode, и получить обе нужные строки сразу. Операции по вычислению верхнего предела лучше в двоичной системе производить.
меня интересует правильно ли так function mask($ip,$mask){ $ip = ip2long($ip); $flag = 1; for($i=0;$i<$mask;$i++){ $ip = $ip | $flag; $flag <<= 1; //Двигаем биты } return $ip; } подсчитано верхний предел?