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





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

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

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

А у меня, как ни странно, делает, но, не имея под рукой исходных данных, могу проверять только на своих строках.
<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-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach