Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
  |   |   |   |   |   |   |   |   |   |   |   |   |   | 
извиняюсь... редко пользуюсь, поэтому чуток перепутал  16.12.04 17:54  Число просмотров: 3026
 Автор: LLL <Алексей> Статус: Member
 | 
 
| 
 | 
 
| 
<programming>
 |  
 
  | 
примерно так:  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, поэтому за вторую часть своей необоснованной критики приношу извинения :-)
 | 
 
 
  |   |   |   |   |   |   |   |   | 
Точно!! это я просто лох -))   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}
 
 Ещё вопросы есть?
 | 
 
 
  
 
 | 
 |