|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 03 Jun 2005 01:45:25 To : Vitaly Mayatskih Subject : Re: re -------------------------------------------------------------------------------- Vitaly Mayatskih -> Artem Chuprina @ Thu, 02 Jun 2005 20:15:10 +0400: VM>>> первом и/или третьем паттерне есть совпадение. Т.е. хочется VM>>> конструкцию типа [^...], только для выражения. AC>> В perldoc perlre искать negative look-ahead. VM> Да мне бы лучше подошло look-behind, но оно только fixed VM> length, к сожалению. AC>> Hадеюсь, "или" ты выразить способен и сам... А если хочешь, чтоб на AC>> примере показали - покажи пример. VM> Есть, допустим, строка со сылкой, которую нужно выудить. Если это VM> html-ссылка, то не надо. Собственно говоря, 3-й паттерн не нужен, т.к. по VM> наличию 1-го понятно, что это html. VM> $line = 'lalala <a href="http://tra-lala.com">asd</a>'; VM> $line =~ / VM> (?:\<a\s*href\s*=\s*[\'\"]\s*) # вот у этого бы результат инвертировать Кстати, за первым \s надо +, а не *. VM> ( VM> (?:(?:ht|f)tp\:\/\/) VM> (?:[\w()'*~!.-]+) И кстати, должен заметить, что знаки препинания . и !, когда последние, обычно не относятся к URL. Посему лучше бы заменить на [\w()'*~!.-]*[\w()'*~-]. Да и внешние группировки у обоих подвыражений лишние... VM> ) VM> /x Вообще напрашивается решение "честно парсить HTML и искать только в интересующих фрагментах". А так - я бы сделал бы что-то следующего типа. Предположим, что $urlre - переменная, содержащая подвыражение для собственно URL. Тогда мы пишем цикл вида while ($line =~ /<a\s+href\s*=\s*(['"])$urlre\1|($urlre)/ig) { if ($2) { # нашли } } Модификатор g в скалярном контексте будет начинать следующий поиск от конца предыдущего, и по правилу "преимущество имеет более ранний по тексту", если есть возможность поматчить URL в <a href, именно он и будет поматчен. Матч будет, но $2 при этом - undef. Поскольку матч будет, то подвыражение, удовлетворяющее второй альтернативе, следующим поиском рассматриваться не будет. Тут, правда, есть еще призовая игра под названием "а правда ли, что в других атрибутах тега тебя URL устроит?". Если неправда - жить лучше (просто первая альтернатива заметно усложнится). Если правда - хуже, поскольку никакого порядка на атрибутах никто не обещал. Тоже можно, но вот тут уже заведомо дешевле будет честно распарсить HTML. -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru В теории нет различия между теорией и практикой. Hа практике - есть. --- ifmail v.2.15dev5.3 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/3426092f54e8c.html, оценка из 5, голосов 10
|