Добрый день. Есть следующая ситуация : Код (Text): <?php $cur_ip_adrr = $_SERVER['REMOTE_ADDR']; //получили текущий адресс $ip_array = array('192.168.0.1','192.168.0.2','192.168.0.3','127.0.0.1'); //массив по простому if (in_array($cur_ip_adrr, $ip_array)) echo 'YES'; //проверили вхождение элемента в массив ?> Но на самом деле массив ИП-адресов выглядит так 66.231.188.0/24 (для примера), точнее таких массивом много (допустим 10) Вопрос : как средствами РНР из 66.231.188.0/24 сделать последовательность элементов?
неправильный вопрос. Нужно проверить входит ли ip-адрес в какуюто из подсетей перечисленных в массиве. кто сказал что для этого нужно превращать подсеть во всю последовательность адресов? гуглим CIDR, маска подсети т.д. ибо зная как это работает, сразу станет понятно как должна выглядеть функция. например так Код (PHP): function ipCIDRcheck($ip, $cidr) { list($net, $mask) = explode('/', $cidr); return ( ip2long($ip) & (-1<<(32-$mask)) ) == ip2long($net); } далее просто перебираем массив с подсетями и проверяем куда входит наш адрес.
И вот что получилось : Код (Text): <?php //массив СИДР чиста для проверки работоспособности $ip_array = array( '192.168.0.0/24', //доступ к серверу из ЛВС '127.0.0.0/8' //локальный хост ); //текущий ИП-адрес посетителя $cur_ip_adrr = $_SERVER['REMOTE_ADDR']; //функция определения вхождения ИП в СИДР, спасибо что подсказали function ipCIDRcheck($ip, $cidr) { list($net, $mask) = explode('/', $cidr); return ( ip2long($ip) & (-1<<(32-$mask)) ) == ip2long($net); } //ЦИКЛ проверки вхождения текущего ИП в СИДРы $flag = false; foreach($ip_array as $cur_cidr) { if ((ipCIDRcheck($cur_ip_adrr, $cur_cidr)) == true) {$flag = true; break;} //при первом вхождении установить флаг и выйти из цикла else {/*может потом что то допишу*/} } if ($flag == true) {echo 'YES';} //все отлично else {echo 'NO';} //принмаем меры к нарушителю ?> Теперь можно критиковать