Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Помогите прочесть regexp, определяющий ip адрес


Автор: Royan 15.12.2007, 23:53
Нашел регулярное выражение, проверяющее на валидность ip адрес

пример работы:
Код

preg_match("/\b(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])\b/", "127.0.0.10", $ip);
print_r($ip);


Вопрос, конечно, не совсем тактичный, ибо я по долгу профессии обязан был бы разобраться сам, но для меня выражение выглядит, как на французском (которого я не знаю), а именно, могу найти слово в словаре (я понимаю что такое \b или \d), но вся фраза, ни пса, яснее не становится.

Автор: SelenIT 16.12.2007, 00:40
(
( - одно из нижеследующего:
[01]?\d?\d - однозначное или двузначное число, или трехзначное, начинающееся на 0 или 1 (обязательна только последняя цифра), т.е. числа 0-199 
| - или
2[0-4]\d - числа 200 - 249
| - или
25[0-5] - числа 250 - 255
)
\. - с точкой после всего этого
)
{3} - таких комбинаций 3 штуки
а после этого опять число из 3-х диапазонов (как выше), но без точки в конце.

P.S. Не лучше ли для проверки айпишника на допустимость использовать ip2long?  smile 

Автор: Royan 16.12.2007, 01:33
Спасибо SelenIT!

Цитата(SelenIT @  15.12.2007,  21:40 Найти цитируемый пост)
Не лучше ли для проверки айпишника на допустимость использовать ip2long

Разумеется, можно, но этот пример все таки изящней, а после твоих разъяснение еще и полностью понятен, а когда ip превратить в long то там вообще ничего непонятно, хотя и это исправляется с помощью комментариев.


Автор: SelenIT 16.12.2007, 02:11
Цитата(Royan @  16.12.2007,  01:33 Найти цитируемый пост)
когда ip превратить в long то там вообще ничего непонятно

Я полагал, что задача - проверить ip на валидность. А для этого достаточно убедиться, что ip2long не вернула -1 или false...

Автор: Royan 16.12.2007, 19:47
Цитата(SelenIT @  15.12.2007,  23:11 Найти цитируемый пост)
 А для этого достаточно убедиться, что ip2long не вернула -1 или false...

Дельное замечание, я как то даже не посмотрел что возвращает эта функция в случае ошибки.

Автор: Royan 16.12.2007, 20:05
Вообще я тут посмотрел внимательней ip2long не так "чиста" как кажется, например, следующий код она считает вполне валидным:

Код

var_dump(ip2long("10.0.256"));


кроме того функция возвращает -1 вот в таком случае:

Код

var_dump(ip2long("255.255.255.255"));

Автор: gemaglabin 10.2.2008, 13:38
О безопасности использования ip2long

Код


var_dump( ip2long( '127.0.0.1') ); 
php -> int(2130706433)

var_dump( ip2long( '127.0.0.1A' ) ); 
php-> bool(false)

var_dump( ip2long( '127.0.0.1' . chr(9) .'union select \'underWHAT?!\'' ) ); 
php -> int(2130706433)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)