информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаАтака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ой, намудрил :-) 10.12.04 10:29  Число просмотров: 3144
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Всё проще:

То, что ты хочешь, имеет следующий формат:

http:\/\/(\w\.){2,}\w{2,4}

Это Тебе и надо искать. НО! После него могут идти ещё какие-то символы. Соответственно, надо указанное выражение заключить в круглые скобки (тогда совпадение запишется в переменную $1), а после сразу указать ".*?$" - то есть мы будем искать последнее вхождение подстроки (знак вопроса обозначает, что поиск будет соответствовать совпадению с минимальной длинной). Итого код:

$text=~m/(http:\/\/(\w\.){2,}\w{2,4}).*?$/;

В переменной $1 лежит то что требуется. Код писал "на лету" - возможно, где-то ошибся. Если не работает, поправим :-) В общем, думаю, суть ясна.
<programming>
регулярные выражения 09.12.04 20:39  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
недано начал изучать, не пойму как сделать такую вещь:
есть строка (лог прокси)
GET http://servedby.advertising.com/site=693265/size=468060/bnum=25706478/ctrt=4?http://ar.atwola.com/redir/B0/G6hJ3Fue06S7J6h9ZgQcJKT4acA2vZPb2wZSyWCpnEuywBnuna6aWA$$/
я хочу выдрать из нее последнее вхождение htpp://x.y.z, те есть в данном случае http://ar.atwola.com пишу в перле так:
while ($before =~ m/http.+\/{2}[^\/]+\/{1}/g)
{
$itog=$&;
}
print ("$itog\n");
$before - как раз эта строка, в итоге получается кодга в строке соержится один раз http, все замечательно на выходе получатеся http://x.y.z, т.е короткий путь тока имя сервера и все, а кады в строке нескока раз http, как в этой, получается:
http://servedby.advertising.com/site=693265/size=468060/bnum=25706478/ctrt=4?http://ar.atwola.com/
как сделать так чтобы выцеплялось тока полседнее вхождение?? (нужно тока http://ar.atwola.com/
)
Спасибо!!
примерно так: 09.12.04 21:47  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
> как сделать так чтобы выцеплялось тока полседнее
> вхождение??

($itog = $before) =~ s/^.*(?=http:\/\/)//;

---

соответственно, вся фильтрация входного потока могла бы так осуществлятся:
while(<>)
{
  s/^.*(?=http:\/\/)//;
  print;
}

---
не получается -(( 10.12.04 08:50  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
> > как сделать так чтобы выцеплялось тока полседнее
> > вхождение??
>
>
> ($itog = $before) =~ s/^.*(?=http:\/\/)//;
> 

---
>
> соответственно, вся фильтрация входного потока могла бы так
> осуществлятся:
> while(<>)
> {
>   s/^.*(?=http:\/\/)//;
>   print;
> }
> 

---
Если честно я слабо чего понял -(( s- это ж оператор подстановки??, ну короче тупо подставив это выражение в свой скрипт результата я не достиг, причем по ходу он вообще ничего не делает со строкой....
странно 10.12.04 16:46  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
> Если честно я слабо чего понял -(( s- это ж оператор
> подстановки??, ну короче тупо подставив это выражение в

s -- операция замены, а именно здесь мы заменяем все лишнее из начала строки на пустую строку, т.е. удаляем

> свой скрипт результата я не достиг, причем по ходу он
> вообще ничего не делает со строкой....

А у меня, как ни странно, делает, но, не имея под рукой исходных данных, могу проверять только на своих строках.
Ой, намудрил :-) 10.12.04 10:29  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Всё проще:

То, что ты хочешь, имеет следующий формат:

http:\/\/(\w\.){2,}\w{2,4}

Это Тебе и надо искать. НО! После него могут идти ещё какие-то символы. Соответственно, надо указанное выражение заключить в круглые скобки (тогда совпадение запишется в переменную $1), а после сразу указать ".*?$" - то есть мы будем искать последнее вхождение подстроки (знак вопроса обозначает, что поиск будет соответствовать совпадению с минимальной длинной). Итого код:

$text=~m/(http:\/\/(\w\.){2,}\w{2,4}).*?$/;

В переменной $1 лежит то что требуется. Код писал "на лету" - возможно, где-то ошибся. Если не работает, поправим :-) В общем, думаю, суть ясна.
блин ну не черта не понимаю!!! -(((( 10.12.04 17:38  
Автор: dron <Ivanov Andrey> Статус: Member
Отредактировано 10.12.04 17:44  Количество правок: 1
<"чистая" ссылка>
> Всё проще:
>
> То, что ты хочешь, имеет следующий формат:
>
> http:\/\/(\w\.){2,}\w{2,4}
>
> Это Тебе и надо искать. НО! После него могут идти ещё
> какие-то символы. Соответственно, надо указанное выражение
> заключить в круглые скобки (тогда совпадение запишется в
> переменную $1), а после сразу указать ".*?$" - то есть мы
> будем искать последнее вхождение подстроки (знак вопроса
> обозначает, что поиск будет соответствовать совпадению с
> минимальной длинной). Итого код:
>
> $text=~m/(http:\/\/(\w\.){2,}\w{2,4}).*?$/;
>
> В переменной $1 лежит то что требуется. Код писал "на лету"
> - возможно, где-то ошибся. Если не работает, поправим :-) В
> общем, думаю, суть ясна.
бЛИН НУ НЕ ЧЕРТА НЕ ПОНИМАЮ!!! -((((
в доках написано что
*? - 0 и более, а не последнее вхождение, короче я сделал так вроде работает:
while ($text =~m/http.{1,9}([^\/|%|\;]{1,100}\.){1,7}[a-z|0-9|:|_]+/g)
после http идет обычно ://, но иногда они полность либо частично заменены %3A%2F%2F
затем ищем что-то наподобие www., или yandex. или rambler., соответсвенно так может быть несколько раз ну и напоследок любой набор букв без точки на конце т.е. ru com или org, все это деоается пока не встретится '/' или % (%2F == '/') (что оначает http://www.yandex.ru/.....) мне нужен кототкий путь, ну и также убрал ';' так как есть варианты www.xxx.ru;rf=yyy;h=llаа. Вот вроде все, как сделать проще не знаю (может посоветуете? сталкиваюсь с регулярными выражениями третий раз в жизни (до этого формат мак-алреса пытался через регулярные выражения проверить) а с перлом - первый раз
Рабочий код [upd] 10.12.04 19:20  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 11.12.04 14:19  Количество правок: 1
<"чистая" ссылка>
$text=~m#.*(http(:|%3A)(/2F){2}([\w\-]+\.)+[A-Za-z]{2,4})#i;

В результате выполнения такой строки в переменную $1 заносится последняя встреченная в переменной $text подстрока вида http://domain.name.xxx (причём это может быть и ya.ru, и hello.win.go.home - всё учтено). Возможность встречи %3A и %2F так же рассмотрена.

*? - это действительно ноль и более совпадений, но только в этом случае он ищет минимальное количество совпадений. Тут я, конечно, напортачил - надо было ставить такую конструкцию в самом начале.

И вторая ошибка в моём же коде: было [\w\.]+, что значит алфавитно-цифровой символ и сразу следом за ним точка. Просто описАлся. Надо: [\w+\.]+

Вот, в общем-то, и всё. Код работает - проверено. Если ещё чего непонятно - спрашивай, ответим :-)

----------------
[upd]
Пардон, опять ошибся. Поставил после .* лишний знак вопроса - в нынешнем варианте всё правильно.
Вот щас все понятно -)) 14.12.04 12:52  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
У меня примерно тоже самое вышло, тока я вместо \w использовал[a-z|0-9|_|:] с опцией /i Всем большое спасибо!!!
[Perl] поправочка 14.12.04 11:58  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
>$text=~m#.*(http(:|%3A)(/2F){2}([\w\-]+\.)+[A-Za-z]{2,4})#i;
>
> В результате выполнения такой строки в переменную $1
> заносится последняя встреченная в переменной $text
> подстрока вида http://domain.name.xxx (причём это может
> быть и ya.ru, и hello.win.go.home - всё учтено).
> Возможность встречи %3A и %2F так же рассмотрена.

В предложенном варианте не учитывается возможность шестнадцатиричного представления символов имени хоста, поэтому более универсальный вариант может выглядеть так:
$text =~ s/%([\da-f]{2})/pack("c",hex($1))/gie;
$text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;

---
Тут мы еще не заморачиваемся со структурой имени хоста, а берем просто все до /

> И вторая ошибка в моём же коде: было [\w\.]+, что значит
> алфавитно-цифровой символ и сразу следом за ним точка.
> Просто описАлся. Надо: [\w+\.]+

Вот в частности про эти одиночные буквы с точками я и говорил, что "лажа какая-то".
А еще я плохо прочитал задание, предположив, что нужен целиком последний URL, поэтому за вторую часть своей необоснованной критики приношу извинения :-)
Блин такой компактный код бессилен по ходу на таких вот... 14.12.04 12:57  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
> В предложенном варианте не учитывается возможность
> шестнадцатиричного представления символов имени хоста,
> поэтому более универсальный вариант может выглядеть
> так:
> $text =~ s/%([\da-f]{2})/pack("c",hex($1))/gie;
> $text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
> 

---
> Тут мы еще не заморачиваемся со структурой имени хоста, а
> берем просто все до /
>
Блин такой компактный код бессилен по ходу на таких вот вещах:
GET http://servedby.advertising.com/site=693265/size=468060/bnum=25706478/ctrt=4?http://ar.atwola.com/redir/B0/G6hJ3Fue06S7J6h9ZgQcJKT4acA2vZPb2wZSyWCpnEuywBnuna6aWA$$/ HTTP/1.0
выдает:
GET http://servedby.advertising.com/site=693265/size=468060/bnum=25706478/ctrt=4?http://ar.atwola.com/
а нужно тока http://ar.atwola.com/
[Perl] этот код выдает как раз то, что надо 14.12.04 18:40  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
> GET
> http://servedby.advertising.com/site=693265/size=468060/bnu
> m=25706478/ctrt=4?http://ar.atwola.com/redir/B0/G6hJ3Fue06S
> 7J6h9ZgQcJKT4acA2vZPb2wZSyWCpnEuywBnuna6aWA$$/ HTTP/1.0
> выдает:
> GET
> http://servedby.advertising.com/site=693265/size=468060/bnu
> m=25706478/ctrt=4?http://ar.atwola.com/
> а нужно тока http://ar.atwola.com/

По крайней мере у меня в перле 5.
М.б. не там ищем результат?
Это была вариация на то, что предложил Heller, и результат там должен оказываться в $1, а не в $text
Точно!! это я просто лох -)) 15.12.04 10:26  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
а я в $& смотрел....
а если заменить
$text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
на
$text =~ m#(rel="nofollow">http://[^/]+)($)#i; (.* из начала убрать)
то результат будет по идее как раз в $&

Спасибо!!!!
Нет, не будет. Совпадение с шаблоном URL'а действительно... 15.12.04 14:20  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> а я в $& смотрел....
> а если заменить
> $text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
> на
> $text =~ m#(rel="nofollow">http://[^/]+)($)#i; (.* из начала убрать)
> то результат будет по идее как раз в $&

Нет, не будет. Совпадение с шаблоном URL'а действительно окажется в $&, но вот только это будет первое совпадение, а не последнее, как требуется.
Надеюсь последний вопрос... 16.12.04 09:44  
Автор: dron <Ivanov Andrey> Статус: Member
<"чистая" ссылка>
> > а я в $& смотрел....
> > а если заменить
> > $text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
> > на
> > $text =~ m#(rel="nofollow">http://[^/]+)($)#i; (.* из начала
> убрать)
> > то результат будет по идее как раз в $&
>
> Нет, не будет. Совпадение с шаблоном URL'а действительно
> окажется в $&, но вот только это будет первое совпадение, а
> не последнее, как требуется.
А нельзя ли вкратце озвучить алгоритм поиска, я не совсем понимаю почему такая конструкция:
$text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
заносит в $1 последнее совпадение??
Я то делал поначалу
while ($text =~ m#.*(rel="nofollow">http://[^/]+)($)#gi)
{
print "$1";
}
а потом сделал
if ($text =~ m#.*(rel="nofollow">http://[^/]+)($)#i)
{
print "$1";
}
и смотрю действительно последнее совпадение показывает....
Да и вообще как поиск осуществляется с конца строки или сначала??
[Perl] ответ на него такой: 16.12.04 10:10  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
> А нельзя ли вкратце озвучить алгоритм поиска, я не совсем
> понимаю почему такая конструкция:
> $text =~ m#.*(rel="nofollow">http://[^/]+)($)#i;
> заносит в $1 последнее совпадение??

Это из-за того, что * -- означает жадный режим поиска соответствия, т.е. с максимально возможной длиной совпадающего фрагмента. Если нужно наоборот минимальное совпадение, то надо использовать ?*

> Да и вообще как поиск осуществляется с конца строки или
> сначала??

Поиск осуществляется с начала.
Только не "?*", а "*?" 16.12.04 15:44  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Попробую дать более развёрнутый ответ, что бы понятнее было.

Квантификаторы (конструкции, которые указывают на то, что элемент повторяется несколько раз) бывают следующие:

* - ноль или несколько совпадений
+ - одно или несколько совпадений
, - ноль или одно совпадение
{n} - точно n совпадений
{m,n} - от n до m совпадений

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

Поиск начинается с начала строки и идёт в сторону конца. При этом, если используются квантификаторы, Perl ищет максимально длинный из всех возможных вариант. Пример:

$text="abcabcabc";
$text=~s/.+a//;

Точка означает совпадение с любым символом, кроме \n (если не указан модификатор s).

В результате в переменной $text окажется строка "bc". Это свойство квантификаторов называется "жадностью". Что бы ограничить жадность квантификатора, после него необходимо поставить знак вопроса:

$text="abcabcabc";
$text=~s/.+?a//;

Вот теперь в $text будет "bcabc". Думаю, из этих примеров всё понятно.
извиняюсь... редко пользуюсь, поэтому чуток перепутал 16.12.04 17:54  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
подозрительная строка какая-то 10.12.04 16:43  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка>
> Всё проще:
>
> То, что ты хочешь, имеет следующий формат:
>
> http:\/\/(\w\.){2,}\w{2,4}

Че-то тут какая-то лажа понаписана, IMHO
Какая ещё лажа? 10.12.04 18:35  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 10.12.04 18:37  Количество правок: 1
<"чистая" ссылка>
> > Всё проще:
> >
> > То, что ты хочешь, имеет следующий формат:
> >
> > http:\/\/(\w\.){2,}\w{2,4}
>
> Че-то тут какая-то лажа понаписана, IMHO
Какая ещё лажа?

http: - это понятно.
\/\/ - два слеша
\w - алфовитно-цифровой символ
\. - точка
(\w\.){2,} - это, стало быть, по крайней мере два блока из алфавитно-цифровых символов, заканчивающихся точкой.
\w{2,4} - от двух до четырёх алфавитно-цыфровых символов (то есть "ru", "net", "info" и прочее)

Хотя, конечно, не всё тут учтено: например, здесь нигде не фигурирует дефис, который вообще-то может встретиться. Да и я не разу не видел домена типа "ru" или "org", содержищего цифру. Ну и ещё с "покрайней мере два" я погорячился - достаточно одного. Ну, писал на лету, не усмотрел - у всех бывает. Так что лучше написать так:

http:\/\/([\w\-]\.)+[A-Za-z]{2,4}

Ещё вопросы есть?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach