|
|
ru.website- RU.WEBSITE ------------------------------------------------------------------- From : Serge Shikov 2:5020/400 08 Jul 2000 12:30:49 To : All Subject : Re: вырезание атрибутов -------------------------------------------------------------------------------- Andrej Ramaszeuski wrote: > > >> Регекспы годятся для всего. > SS> Hе надо сказок. Регекспы не предназначены для разбора рекурсивных > SS> структур, какой является HTML. > С коих поp html стал pекуpсивным? С тех, когда внутри одного тэга стало можно вкладывать другие. Т.е. от рождения. <b><i><b>Text</b></i></b> - типичный пример b внутри b. > >> SS> Для этого HTML::Parser имеется. > >> Разговоp шёл о фильтpации а не паpсинге. > SS> А давай ты сначала посмотришь на то, что предлагают, а потом уж будешь > SS> лезть со своими пятью копейками. В комплекте HTML::Parser есть модуль > SS> HTML::Filter, который именно фильтр для HTML и есть. > А тепеpь давай откpоем Parser.pm и Filter.pm и не поленимся изучить текст. > Hикаких бинаpных модулей они не используют. Про бинарные это ты к чему? Я нигде не говорил, что это надо не на перле писать. > Зато pегекспы там написаны гpамотные. Можно пользовать :) HTML::Filter вообще никаких регекспов не содержит, если ты как следует взглянешь. Т.е. совсем - в нем всего-то 19 строчек. Что же касается парсера, то регекспы там конечно есть, только разбор сделан вовсе не с их помощью. Регекспы занимаются своим делом - распознают отдельные лексемы. Все остальное делается при помощи лома и какой-то матери, т.е. обычными if-ами и while, которые вовсе не регекспы, как ты понимаешь. А если ты еще посмотришь, то найдешь кусок для разбора start-tag, который представляет из себя большой такой if then elsif elsif ... else, строк на 70. И который тоже вовсе не регексп. И наконец вернемся к нашим баранам - к атрибутам то есть. Вот кусок, который их разбирает: while ($$buf =~ s|^(([a-zA-Z][a-zA-Z0-9\.\-_]*)\s*)||) { $eaten .= $1; my $attr = lc $2; my $val; # The attribute might take an optional value (first we # check for an unquoted value) if ($$buf =~ s|(^=\s*([^\"\'>\s][^>\s]*)\s*)||) { $eaten .= $1; $val = $2; HTML::Entities::decode($val); # or quoted by " or ' } elsif ($$buf =~ s|(^=\s*([\"\'])(.*?)\2\s*)||s) { $eaten .= $1; $val = $3; HTML::Entities::decode($val); # truncated just after the '=' or inside the attribute } elsif ($$buf =~ m|^(=\s*)$| or $$buf =~ m|^(=\s*[\"\'].*)|s) { $$buf = "$eaten$1"; last TOKEN; } else { # assume attribute with implicit value $val = $attr; } $attr{$attr} = $val; push(@attrseq, $attr); } если это называется регексп, то я ваще молчу. --- ifmail v.2.15dev5 * Origin: home (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.website/282543aae63c.html, оценка из 5, голосов 10
|