Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: re   Artem Chuprina   03 Jun 2005 01:45:25 
Архивное /ru.perl/3426092f54e8c.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional