2010-12-21 5 views
5

ich ersetzen wollen:Wie zu stoppen. + Bei der ersten Instanz eines Zeichens und nicht die letzte mit regulären Ausdrücken in Perl?

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

mit:

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

Nun meine vorhandenen Code ist:

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

Doch diese endet mit diesem als Ergebnis auf:

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

Jetzt kann ich sehen, was passiert, es passt <font size ="..... all the way up to the end of the <font colour blue"> was ist nicht das, was ich will, ich will es bei der ersten Instanz von stoppen " nicht die letzte, dachte ich, dass ist, was das setzen? Mark würde es tun, aber ich habe es versucht. +. +? .* und .*? mit dem gleichen Ergebnis jedes Mal.

Wer hat irgendwelche Ideen, was ich falsch mache?

+5

Sie nicht [X] HTML mit Regex analysieren kann: http://stackoverflow.com/question s/1732348/regex-match-open-tags-except-xhtml-in sich geschlossene-tags/1732454 # 1732454 –

Antwort

4

Wie Mark sagte, nur CPAN für diese.

#!/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> 

Dies funktioniert für Ihren speziellen Fall, aber:

#!/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

noch besser , Danke! – rolls

8

Schreiben Sie .+?an allen Orten, um jedes Spiel nicht gierig zu machen.

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

Versuchen Sie auch, die Verwendung von regulären Ausdrücken zum Parsen von HTML zu vermeiden. Verwenden Sie nach Möglichkeit einen HTML-Parser.

+0

Bereits versucht, dies nach meinem Kommentar und es hat nicht funktioniert. Ich habe keine HTML-Parser verwendet, irgendwelche Vorschläge? – rolls

7

könnten Sie .+-[^"]+ ändern (statt „nichts gefunden“, „nichts gefunden, das kein " ist“ ...

+0

Versucht, und es überhaupt nichts passt, hier ist, was ich verwendet: $ html = ~ s/\ n (. +?) (. +) <\/font> (. +?) \ n/\ n === $ 1 $ 2 $ 3 === \ n/m; – rolls

+0

Hmm, es hat an der Zeichenkette gearbeitet, die ich im Beispiel gepostet habe, aber es passt überhaupt nicht zu diesem Beispiel, Ideen ?: '' ' SOMMER/WINTER KONFIGURATIONSDATEIEN' '' – rolls

Verwandte Themen