|
|
|
| Не могу решить вроде бы простую задачу - помогите плиз!
Например есть ip адреса
1) 11.22.33.0 - 11.22.33.255
2 44.55.66.0 - 77.88.99.255
Как отсортировать if-ом , что входящий ip принадлежит первой или второй группе?
вроде на ум приходят функции in_array и strpos
но както не связывается - все получается громоздко и по ламерски....
Подскажите плиз - может есть оригинальное решение? | |
|
|
|
|
|
|
|
для: Nevi
(14.10.2009 в 20:44)
| | if ($c <= $b AND $c >= $a) {
echo 'ok';
}
Где $b - наибольшее значение промежутка, $a - наименьшее значение промежутка, $c - ip | |
|
|
|
|
|
|
|
для: neadekvat
(14.10.2009 в 21:03)
| | не смешно | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2009 в 21:17)
| | Того же мнения. Это не смешной, но рабочий вариант | |
|
|
|
|
|
|
|
для: 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' | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2009 в 21:23)
| | У меня получилось с первого раза рандомно написать айпи так, чтобы условие оказалось верным. Из серии "не подумал". | |
|
|
|
|
|
|
|
для: 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 адресе меняется.... :( | |
|
|
|
|
|
|
|
для: Nevi
(14.10.2009 в 21:19)
| | правильный путь - преобразовывать ip из текста в двоичный вид ipv4 , а из него - в шестнадцатеричное беззнаковое представление из 8 символов big endian .
В таком виде и сравнивать.
Другой путь на php будет приводить к ошибкам | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2009 в 21:25)
| | как могут быть ошибки если тупо сравнивать стринговые переменные в которых нет букв
а цифры во всех кодировках одинаковые ???
К сожалению я даже не понял ответа - почитал в гуугле щас - вообще запутался ...
нельзя ли пример ?
Кстати - только что придумал еще способ
принимает ip исразу же откидываем последнюю декаду...
а потом тупо сравниваем in_array
мне кажется это простейшее решение - что скажете7=) | |
|
|
|
|
|
|
|
для: Nevi
(14.10.2009 в 21:36)
| | попробуйте - увидите. | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2009 в 21:48)
| | а подскажите стандартную функцию php чтобы выводило все по последнюю точку[символ]?
123.234.163.121
чтобы вывело
123.234.163 отрезав .121
я нашел чтото типа strrchr которая только показывает .121 ...а мне надо наоборот чтобы показывало все до этого...
наверняка есть функция - ведь есть же .strrchr | |
|
|
|
|
|
|
|
для: 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];
?>
|
| |
|
|
|
|
|
|
|
для: Diplex
(14.10.2009 в 23:28)
| | регулярными выражениями не хотелось бы принципиально
1. долгие
2. возможны изменения от версии к версии | |
|
|
|
|
|
|
|
для: Nevi
(14.10.2009 в 22:28)
| | Не нужно оно Вам...
function ipv4flat($addr) { return bin2hex(pack('l', ip2long($addr))); }
После такого преобразования адреса можно будет сравнивать на больше/меньше/равно. | |
|
|
|
|
|
|
|
для: 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
{ нифига нет такого}
скажите - чем плох этот способ? | |
|
|
|
|
|
|
|
для: Nevi
(15.10.2009 в 00:01)
| | а если встанет задача работать с диапазонами адресов, которые не являются сетями класса C? | |
|
|
|
|
|
|
|
для: Trianon
(14.10.2009 в 23:39)
| | При конвертировании bin2hex получаем строку. Как потом эти строки на больше/меньше сравнивать?
У вас там кстати точка с запятой не там стоит. | |
|
|
|
|
|
|
|
для: Лена
(15.10.2009 в 10:48)
| | как строки сравнивают. if($s1 <= $s_ip && $s_ip <= $s2)
Точку с запятой - спасибо - поправил. | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2009 в 12:23)
| | Проверила на примере. Все правильно. Раньше думала, что только числа сравниваются, а строки только по длине. | |
|
|
|