Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как определить вхождение ip?
 
 автор: Nevi   (14.10.2009 в 20:44)   письмо автору
 
 

Не могу решить вроде бы простую задачу - помогите плиз!

Например есть ip адреса
1) 11.22.33.0 - 11.22.33.255
2 44.55.66.0 - 77.88.99.255

Как отсортировать if-ом , что входящий ip принадлежит первой или второй группе?
вроде на ум приходят функции in_array и strpos
но както не связывается - все получается громоздко и по ламерски....

Подскажите плиз - может есть оригинальное решение?

  Ответить  
 
 автор: neadekvat   (14.10.2009 в 21:03)   письмо автору
 
   для: Nevi   (14.10.2009 в 20:44)
 

if ($c <= $b AND $c >= $a) {
echo 'ok';
}

Где $b - наибольшее значение промежутка, $a - наименьшее значение промежутка, $c - ip

  Ответить  
 
 автор: Trianon   (14.10.2009 в 21:17)   письмо автору
 
   для: neadekvat   (14.10.2009 в 21:03)
 

не смешно

  Ответить  
 
 автор: neadekvat   (14.10.2009 в 21:18)   письмо автору
 
   для: Trianon   (14.10.2009 в 21:17)
 

Того же мнения. Это не смешной, но рабочий вариант

  Ответить  
 
 автор: Trianon   (14.10.2009 в 21:23)   письмо автору
 
   для: neadekvat   (14.10.2009 в 21:18)
 

Вам самому контрпример не придумать?
Пожалуйста. Входит ли IP 11.22.33.10/29 в свою собственную подсеть?
$a = '11.22.33.8'
$b = '11.22.33.15'
$ip = '11.22.33.10'

  Ответить  
 
 автор: neadekvat   (14.10.2009 в 21:26)   письмо автору
 
   для: Trianon   (14.10.2009 в 21:23)
 

У меня получилось с первого раза рандомно написать айпи так, чтобы условие оказалось верным. Из серии "не подумал".

  Ответить  
 
 автор: Nevi   (14.10.2009 в 21:19)   письмо автору
 
   для: neadekvat   (14.10.2009 в 21:03)
 

спасибо - НО вопрос ШИРЕ.
Я видимо не полностью сказал
пример

есть ip адреса, которые, мне нужно проверить
$ipaa = array('12.23.34.','12.56.67.','80.45.45.','111.58.222.','18.155.62.');
приходит ip
$rip = $_SERVER['REMOTE_ADDR']; // IP
пусть например
12.23.34.126
ОБРАТИТЕ ВНИМАНИЕ в массиве $ipaa последняя декада не указана - т.к. она может быть от 0 до 255

вот теперь нужно чтото типа
if (strpos($rip, $ipaa) === false)
но никак связать не могу сутки уже сижку...

Мне кажется такой путь правильный - он будет маленький и гибкий

если я не прав насчет пути - помогите тоже плиз!!!

Нужна такая гибкость - чтобы можно было добавлять $ipaa не перекраивая кода


if (in_array($rip, $ipaa)) - эта функция тупо сравнивает на АБСОЛЮТНУЮ похожесть - а что если последняя четверка в ip адресе меняется.... :(

  Ответить  
 
 автор: Trianon   (14.10.2009 в 21:25)   письмо автору
 
   для: Nevi   (14.10.2009 в 21:19)
 

правильный путь - преобразовывать ip из текста в двоичный вид ipv4 , а из него - в шестнадцатеричное беззнаковое представление из 8 символов big endian .
В таком виде и сравнивать.
Другой путь на php будет приводить к ошибкам

  Ответить  
 
 автор: Nevi   (14.10.2009 в 21:36)   письмо автору
 
   для: Trianon   (14.10.2009 в 21:25)
 

как могут быть ошибки если тупо сравнивать стринговые переменные в которых нет букв
а цифры во всех кодировках одинаковые ???

К сожалению я даже не понял ответа - почитал в гуугле щас - вообще запутался ...
нельзя ли пример ?

Кстати - только что придумал еще способ
принимает ip исразу же откидываем последнюю декаду...
а потом тупо сравниваем in_array
мне кажется это простейшее решение - что скажете7=)

  Ответить  
 
 автор: Trianon   (14.10.2009 в 21:48)   письмо автору
 
   для: Nevi   (14.10.2009 в 21:36)
 

попробуйте - увидите.

  Ответить  
 
 автор: Nevi   (14.10.2009 в 22:28)   письмо автору
 
   для: Trianon   (14.10.2009 в 21:48)
 

а подскажите стандартную функцию php чтобы выводило все по последнюю точку[символ]?

123.234.163.121

чтобы вывело

123.234.163 отрезав .121

я нашел чтото типа strrchr которая только показывает .121 ...а мне надо наоборот чтобы показывало все до этого...

наверняка есть функция - ведь есть же .strrchr

  Ответить  
 
 автор: Diplex   (14.10.2009 в 23:28)   письмо автору
 
   для: Nevi   (14.10.2009 в 22:28)
 

способов много, можно так:


<?
preg_match_all
("/(\w+)\.(\w+)\.(\w+)\.(\w+)/""123.234.163.121"$out); 
echo 
$out[1][0].'.'.$out[2][0].'.'.$out[3][0];
?>

  Ответить  
 
 автор: Nevi   (15.10.2009 в 00:04)   письмо автору
 
   для: Diplex   (14.10.2009 в 23:28)
 

регулярными выражениями не хотелось бы принципиально
1. долгие
2. возможны изменения от версии к версии

  Ответить  
 
 автор: Trianon   (14.10.2009 в 23:39)   письмо автору
 
   для: Nevi   (14.10.2009 в 22:28)
 

Не нужно оно Вам...

function ipv4flat($addr) { return bin2hex(pack('l', ip2long($addr))); }

После такого преобразования адреса можно будет сравнивать на больше/меньше/равно.

  Ответить  
 
 автор: Nevi   (15.10.2009 в 00:01)   письмо автору
 
   для: Trianon   (14.10.2009 в 23:39)
 

спасибо за ответ! Я обязательно изучу то что вы написали, может даже пойму, т.к. я в первые вижу все представленные функции

а я тем временем все сделал в 3 строки


$dlina = strlen($rip)-strlen(strrchr($rip, '.'));
$rip = substr($rip, 0, $dlina); // тут стал обрезанный ip ex 66.188.77

а потом тупо
задаем сколько угодно вских массиов и делаем

if (in_array($rip, $ipaa))
{ делаем aa }
elseif (in_array($rip, $ipbb))
{ делаем bb }
elseif (in_array($rip, $ipcc))
{ делаем cc }
else
{ нифига нет такого}

скажите - чем плох этот способ?

  Ответить  
 
 автор: Trianon   (15.10.2009 в 00:23)   письмо автору
 
   для: Nevi   (15.10.2009 в 00:01)
 

а если встанет задача работать с диапазонами адресов, которые не являются сетями класса C?

  Ответить  
 
 автор: Лена   (15.10.2009 в 10:48)   письмо автору
 
   для: Trianon   (14.10.2009 в 23:39)
 

При конвертировании bin2hex получаем строку. Как потом эти строки на больше/меньше сравнивать?
У вас там кстати точка с запятой не там стоит.

  Ответить  
 
 автор: Trianon   (15.10.2009 в 12:23)   письмо автору
 
   для: Лена   (15.10.2009 в 10:48)
 

как строки сравнивают. if($s1 <= $s_ip && $s_ip <= $s2)
Точку с запятой - спасибо - поправил.

  Ответить  
 
 автор: Лена   (15.10.2009 в 13:18)   письмо автору
 
   для: Trianon   (15.10.2009 в 12:23)
 

Проверила на примере. Все правильно. Раньше думала, что только числа сравниваются, а строки только по длине.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования