Официальный сайт студ.городка НГТУ
Программирование и БД » Диапазоны в регулярных выражениях 

#1  15.05.06 11:49

Maq
Профиль

Диапазоны в регулярных выражениях

мне нужно распознавать диапазоны в ип адресах вида
217.[64-71].1[40-53].[0-244]
как можно это реализовать?
есть идея насчет извращенного варианта,
сделать парсер, который делает, например,
из [64-71] -> (6[4-9]|7[0-1])
1[40-53] -> 1(4[0-9]|4[0-3])
[0-244] -> ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9]|24[0-4])

как видно получается ужас, а как лучше сделать?

Offline

#2  15.05.06 13:55

Re: Диапазоны в регулярных выражениях

может айпи лучше explode ом разбить и потом каждый октет(ну или как правильно) анализировать?

Offline

#3  15.05.06 14:26

Maq
Профиль

Re: Диапазоны в регулярных выражениях

iDrum, хм.... можно типа такого:

Код: php:

$ip_ar = explode('.', $user_ip);
$addresses = explode(' ', 'тут несколько ип через пробел на совпадения с которыми надо проверить');
for($a=0;$a<count($addresses);$a++)
{
	$cur_ip_ar = explode('.', $addresses[$a]);
	$c = count($cur_ip_ar);
	$j = 0;
	for($i=0;$i<$c;$i++)
	{
		if($ip_ar[$i]==$cur_ip_ar[$i]||$cur_ip_ar[$i]=='*') ++$j;
		if(preg_match('!(^\[\d{1,3}\-\d{1,3}\]$)!', $cur_ip_ar[$i]))
		{
			preg_match_all('!\d{1,3}!', $cur_ip_ar[$i], $tmp);
			if($ip_ar[$i]>=$tmp[0][0] && $ip_ar[$i]<=$tmp[0][1]) ++$j;
		}
	}
	if($c<4 && $cur_ip_ar[$c-1]=='*') $j+=4-$c;
	if ($j == 4) {
		exit ('done');
	}
}
http://217.71.142.5/img/smile/acid.gif

Offline

#4  15.05.06 14:32

Re: Диапазоны в регулярных выражениях

так тебе диапозоны нужно )тебе нада определить принадлежность айпи к какому то одному диапозону?

Offline

#5  15.05.06 16:43

Maq
Профиль

Re: Диапазоны в регулярных выражениях

iDrum, да

Offline

#6  16.05.06 10:19

Re: Диапазоны в регулярных выражениях

А если использовать ip2long? И Обычным сравнением > <
правда условие будет немного не читаемым, но простым и работающим.

Offline

#7  16.05.06 12:11

Re: Диапазоны в регулярных выражениях

Maq, посмотри, как сделано в viruses.php

Код: php:

 if ( preg_match("/217\.71\.14[0-3]\.\d{1,3}/",$name) || preg_match("/192\.168\.[1|2|3|5|6|7]\.\d{1,3}/", $name) )
 

или ты чего хочешь? задачу скажи лучше, а то нифига не понятно

Offline

#8  16.05.06 14:50

Maq
Профиль

Re: Диапазоны в регулярных выражениях

XuMiX, проблема в том что в регулярных выражениях нельзя задать диапазон, например, [140-143]

Offline

#9  16.05.06 14:56

Re: Диапазоны в регулярных выражениях

Maq, с какого это перепугу нельзя задать его?? как ты написал - так оно и задается. Обрати внимание на тот кусок кода, который я дал

Offline

#10  16.05.06 14:58

Maq
Профиль

Re: Диапазоны в регулярных выражениях

XuMiX, Вилен, я не про это, ты попробуй задать диапазон [4-239] например, и что у тебя получиться

Offline

#11  16.05.06 15:04

Re: Диапазоны в регулярных выражениях

а разве не так будет? [4-239]

Offline

#12  16.05.06 15:15

Re: Диапазоны в регулярных выражениях

точно...
http://ru.php.net/ip2long
первый же коммент сверху смотри

Offline

#13  16.05.06 15:16

Re: Диапазоны в регулярных выражениях

Karminsky написал(а):

а разве не так будет? [4-239]

не поканает так

Offline

#14  16.05.06 15:24

Re: Диапазоны в регулярных выражениях

почему?

Offline

#15  16.05.06 15:49

Re: Диапазоны в регулярных выражениях

Karminsky,
А проверить?

Warning:  preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 3 in ...

Offline

#16  16.05.06 15:53

Re: Диапазоны в регулярных выражениях

Эм, сервак глючит, Тарас >:)
Спасибо.

Offline

#17  16.05.06 21:41

Maq
Профиль

Re: Диапазоны в регулярных выражениях

Karminsky,

[4-239] - это он должен понимать как либо диапазон от 4 до 2 (и тут вылетает ошибка), либо 3, либо 9
т.е. выделенное отдельно расматривает.

Offline

#18  17.05.06 14:19

Re: Диапазоны в регулярных выражениях

А оператор диапазона '..' вместо оператора класса символов [] нельзя использовать?
типа
if($1 == 101 .. $1 == 200) { print $1;}

Упс.. так вы не на перле.. тада ладно..

Исправлено Leon (17.05.06 14:56)

Offline

#19  18.05.06 09:30

Re: Диапазоны в регулярных выражениях

в общем случае такой классификатор должен работать с максимальной скоростью, т.е. если данные будут храниться в каком-то развернутом внутреннем формате - это нормально. т.е. когда ты пишешь aaa.bbb.[xxx-yyy].ccc - это не регулярное выражение задается, а описывается маска на каком-то встроенном языке (описание которого должно быть доступно), а уже затем эта маска при помощи тех же регулярных выражений преобразуется во внутренний формат.

использование регулярных выражений в качестве внутреннего представления с предложенным синтаксисом - не удачная идея.

p.s. "217.[64-71].1[40-53].[0-244]"
очень понравилось "1[40-53]". а чё не "140+[0-13]"?
в общем случае все что идет после первого задания диапазона - уже не важно, т.е.: aaa.[xxx-yyy].*

Offline

#20  18.05.06 14:11

Re: Диапазоны в регулярных выражениях

...очень понравилось "1[40-53]". а чё не "140+[0-13]"?...
Matrim, ты вообще использовал оператор класса символов? [0-13] это 0,1 и 3.
Кроме того, запись  140+[0-13]  подойдет, к примеру, к строке :
попа140000000000000000000000
или
фывавыа1401бяка
, но НЕ к
фывавыа1402бяка
и, тем более НЕ к
фывавыа142кака

А такое: "].*" - вообще не прокатит (любой символ задается точкой, а не звездочкой, знаем же?. А точку xxx.yyy вообще говоря экранировать надо {xxx\.yyy} )

PS. И вообще, оператор [] - это НЕ оператор диапазона. Читай маны по регекспам.

Исправлено Leon (18.05.06 14:12)

Offline

#21  18.05.06 18:10

Maq
Профиль

Re: Диапазоны в регулярных выражениях

и все таки сделал так:

Код: php:

$ip_ar = explode('.', $user_ip);
$addresses = explode(' ', 'тут несколько ип через пробел');
for($a=0;$a<count($addresses);$a++)
{
	$cur_ip_ar = explode('.', $addresses[$a]);
	$c = count($cur_ip_ar);
	$j = 0;
	for($i=0;$i<$c;$i++)
	{
		if($ip_ar[$i]==$cur_ip_ar[$i]||$cur_ip_ar[$i]=='*') ++$j;
		//тут добавил
		$cur_ip_ar[$i] = preg_replace('/^(\d*)\[(\d+)\-(\d+)\](\d*)$/', '[\\1\\2\\4-\\1\\3\\4]', $cur_ip_ar[$i]);
		if(preg_match('!(^\[\d{1,3}\-\d{1,3}\]$)!', $cur_ip_ar[$i]))
		{
			preg_match_all('!\d{1,3}!', $cur_ip_ar[$i], $tmp);
			if($ip_ar[$i]>=$tmp[0][0] && $ip_ar[$i]<=$tmp[0][1]) ++$j;
		}
	}
	if($c<4 && $cur_ip_ar[$c-1]=='*') $j+=4-$c;
	if ($j == 4) {
		exit ('done');
	}
}

так как понимают выражения типа:
10.*
10.200.1[4-5]0.*
192.168.[0-255].*
10.*.*.*
и т.п.

Offline

#22  19.05.06 02:21

Re: Диапазоны в регулярных выражениях

Leon написал(а):

...очень понравилось "1[40-53]". а чё не "140+[0-13]"?...

цитируйте полностью, а не кусками

Matrim написал(а):

p.s. "217.[64-71].1[40-53].[0-244]"
очень понравилось "1[40-53]". а чё не "140+[0-13]"?

здесь говорится о языке описания маски ip адресов, взятое из первого поста. этот язык не является регулярным выражением, т.е.  вот тут:

Maq написал(а):

мне нужно распознавать диапазоны в ип адресах вида
217.[64-71].1[40-53].[0-244]

написано не регулярное выражение, а ip адрес в какой-то расширенной нотации.

исходя из этого упражнения вида:

Leon написал(а):

Matrim, ты вообще использовал оператор класса символов? [0-13] это 0,1 и 3.
Кроме того, запись  140+[0-13]  подойдет, к примеру, к строке :
попа140000000000000000000000
или
фывавыа1401бяка
, но НЕ к
фывавыа1402бяка
и, тем более НЕ к
фывавыа142кака

А такое: "].*" - вообще не прокатит (любой символ задается точкой, а не звездочкой, знаем же?. А точку xxx.yyy вообще говоря экранировать надо {xxx\.yyy} )

PS. И вообще, оператор [] - это НЕ оператор диапазона.

в данном случае бесполезны, т.к. обсуждается идея вообще использования регулярных выражений в классификаторе, а не синтаксис какого-то выражения. так что рассуждения про точки и звездочки - мимо кассы, не нужно разбирать как регулярное выражение то, что таковым не является (кстати, весь написанный мною в этом посте текст тоже не является регулярным выражением, большая часть - это классический русский, т.е. если и искать в нем ошибки, то только с точки зрения русского языка, а не синтаксиса регулярных выражений)

Leon написал(а):

Читай маны по регекспам.

временами пишу на перле и использую регулярные выражения, доку читать приходится, т.к. помнить все сложно и не нужно, нужно знать, где можно найти нужное (вот так вот многоэтажно)

в свою очередь могу рекомендовать форум, на котором можно писать не вдаваясь в смысл и не пользуясь головой: http://hostel.nstu.ru/viewforum.php?id=11

Offline

Программирование и БД » Диапазоны в регулярных выражениях 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.250 сек.
Выполнено 14 запросов.