2010-12-21 8 views
5

Chcę wymienić:Jak zatrzymać. + Przy pierwszym wystąpieniu znaku, a nie jako ostatni z wyrażeń regularnych w perlu?

'''<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>''' 

Z:

='''<font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font>'''= 

Teraz mój istniejący kod jest:

$html =~ s/\n(.+)<font size=\".+?\">(.+)<\/font>(.+)\n/\n=$1$2$3=\n/gm 

Jednak to kończy się to na skutek:

=''' SUMMER/WINTER CONFIGURATION FILES</font>'''= 

Teraz mogę zobaczyć, co się dzieje, to pasuje <font size ="..... all the way up to the end of the <font colour blue">, co nie jest tym, co chcę, chcę zatrzymać się na pierwszym wystąpieniu " nie ostatni, myślałem, że to, co oddanie? Oznacz by to zrobić, jednak próbowałem. +. +? .* i .*? z tym samym wynikiem za każdym razem.

Ktoś ma pomysły, co robię źle?

+5

nie można zanalizować [X] HTML z regex: http://stackoverflow.com/question s/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 –

Odpowiedz

4

Jak powiedział Mark, wystarczy użyć CPAN do tego.

#!/usr/bin/env perl 

use strict; use warnings; 
use HTML::TreeBuilder; 

my $s = q{<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>}; 

my $tree = HTML::TreeBuilder->new; 
$tree->parse($s); 
print $tree->find_by_attribute(color => 'blue')->as_HTML; 

# => <font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font> 

działa to dla konkretnego przypadku, jednakże:

#!/usr/bin/env perl 

use strict; use warnings; 

my $s = q{<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>}; 

print $s =~ m{ 
       < .+? > 
       (.+)? 
       </.+? >     
      }mx; 

# => <font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font> 
+0

jeszcze lepiej , Dziękuję Ci! – rolls

8

Napisz .+?we wszystkich miejscach, aby każdy mecz był nie chciwy.

 
$html =~ s/\n(.+?)<font size=\".+?\">(.+?)<\/font>(.+?)\n/\n=$1$2$3=\n/gm 
       ^   ^ ^  ^

Staraj się również unikać wyrażeń regularnych do parsowania HTML. Jeśli to możliwe, użyj analizatora składni HTML.

+0

Próbowałem już tego zgodnie z moim komentarzem i nie zadziałało. Nie użyłem wcześniej parserów HTML, żadnych sugestii? – rolls

7

Można zmienić .+ do [^"]+ (zamiast "pasuje do niczego", "pasuje do niczego, co nie jest "" ...

+0

Próbowałem tego i nic nie pasowało, oto co użyłem: $ html = ~ s/\ n (. +?) (. +) <\/font> (. +?) \ n/\ n === 1 $ 2 $ 3 === \ n/m; – rolls

+0

Hmm działało na napisie, który napisałem w przykładzie, ale na tym przykładzie nie udało się w ogóle dopasować, pomysły ?: '' ' PLIKI KONFIGURACJI LATO/ZIMA' '' – rolls

Powiązane problemy