2014-04-15T21:47:11 linuxCowboyDanke.
Ich habe die faq gelesen: XML::Parser und HTML::Parser.
Aber auch pcrepattern. Wenn auch - offensichtlich - nicht alles verstanden ;-)
Dort gibt es z.B. das Feature "RECURSIVE PATTERNS".
So ein Modul heißt doch eigentlich auch nur, daß jemand, der die Sache verstanden hat, das dann implementiert hat.
Quotezum Beispiel ein fehlendes > beim 2. div
1 2 3
my $result=$txt; 1 while($restult=~s!^.*?<div[^>]*>(.*)</div>.*?$!$1!s); print $result;
'<div > <div > </div><div > not_show_1 </div> </div> show_1 <div > <div > <div > not_show_2 </div> </div> </div> show_2'
2014-04-16T22:17:54 linuxCowboy
1
2
3
my $string = '<div > <div > </div><div > not_show_1 </div> </div> show_1 <div > <div > <div > not_show_2 </div> </div> </div> show_2';
$string =~ s!<div[^>]+>[^<]+</div>!!g while($string =~ m/<div[^>]+>/);
print $string . "\n";
Quoteshow_1 show_2
1
2
3
4
S='<div > <div > </div><div > not_show_1 </div> </div> show_1 <div > <div > <div > not_show_2 </div> </div> </div> show_2'
echo $S | perl -pe 's!$1[^<]+</div>!! while (/(<div[^>]+>)/)'
show_1 show_2
echo $S | perl -wpE's!<\w+\s*/>!!g; s!<(\w+)[^>]*>[^<]*</\1>!!g while /<\w+[^>]*>/'
2014-04-17T09:35:33 RaubtierJa, dieser Nutzer neigt zu Regex-Masochismus.Du kannst jetzt weiter dran rumwerkeln und wirst immer wieder Probleme finden (...)
2014-04-17T09:35:33 RaubtierIch habe mich erbarmt und ihm was gezeigt.(...) oder du guckst dir mal einen HTML-Parser an.
1
2
3
4
S='<div > <div > </div><div > not_show_1 </div> </div> show_1 <div > <a > not_show_2 <i /> </a> <s> </s> </div> show_2'
echo $S | perl -pe 's!<\w+\s*/>!!g; s!<(\w+)[^>]*>([^<]*|(?R))*</\1>!!g;'
show_1 show_2
QuoteThere is no day on SO that passes without a question about parsing (X)HTML or XML with regular expressions being asked.
Quote...HTML::Parser
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#!/usr/bin/perl package FilterDiv; require HTML::Filter; @ISA = qw(HTML::Filter); sub start { my $self = shift; $self->{div_seen}++ if $_[0] eq "div"; $self->SUPER::start(@_); } sub end { my $self = shift; $self->SUPER::end(@_); $self->{div_seen}-- if $_[0] eq "div"; } sub output { my $self = shift; unless ( $self->{div_seen} ) { $self->SUPER::output(@_); } } 1; my $p = FilterDiv->new or die; $p->parse_file(*DATA) or die; __DATA__ <!-- aaaa --><b>a</b> <div > 123<div >aaaa</div> Text <div .. >a</div > .. </div > Text
2014-04-17T15:27:48 linuxCowboyWarte erst mal bis deine Regexe zwei Meter lang sind! Oder du die nach einem Jahr oder länger dann ändern und die "Struktur" wieder neu erkennen musst, dann wünscht du dir einfache Module.Und dreißig Zeilen Code zu schreiben, wo es auch eine regexe tut, ist jetzt auch nicht so motivierend... ;-)