Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | |
Вот щас все понятно -)) 14.12.04 12:52 Число просмотров: 2929
Автор: dron <Ivanov Andrey> Статус: Member
|
У меня примерно тоже самое вышло, тока я вместо \w использовал[a-z|0-9|_|:] с опцией /i Всем большое спасибо!!!
|
<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}
Ещё вопросы есть?
|
|
|