2010-12-21 17 views
5

quiero reemplazar:¿Cómo detener. + En la primera instancia de un personaje y no el último con expresiones regulares en perl?

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

Con:

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

Ahora mi código existente es:

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

Sin embargo, esto termina con esto como el resultado:

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

Ahora puedo ver lo que está sucediendo, está haciendo coincidir <font size ="..... all the way up to the end of the <font colour blue"> que no es lo que quiero, quiero que se detenga en la primera instancia de " no es el último, pensé que eso es lo que está poniendo? marca que haría, sin embargo lo he intentado. +. +? . * y. *? con el mismo resultado cada vez.

¿Alguien tiene alguna idea de lo que estoy haciendo mal?

+5

no se puede analizar [X] HTML con expresiones regulares: http://stackoverflow.com/question s/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 –

Respuesta

4

Como dijo Mark, sólo tiene que utilizar para este CPAN.

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

Esto funciona para su caso específico, sin embargo:

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

incluso mejor , ¡gracias! – rolls

8

Escribe .+?en todos los lugares para hacer que cada partida no sea codiciosa.

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

También intente evitar el uso de expresiones regulares para analizar HTML. Use un analizador HTML si es posible.

+0

Ya lo intenté según mi comentario y no funcionó. No he usado analizadores HTML antes, ¿alguna sugerencia? – rolls

7

Usted podría cambiar .+-[^"]+ (en lugar de "juego cualquier cosa", "igualar cualquier cosa que no es un "" ...

+0

Probado y no coincide con nada, esto es lo que he usado: $ html = ~ s/\ n (. +?) (. +) <\/font> (. +?) \ n/\ n === $ 1 $ 2 $ 3 === \ n/m; – rolls

+0

Hmm funcionó en la cadena que publiqué en el ejemplo, pero no coincide en absoluto con este ejemplo, ¿ideas ?: '' ' ARCHIVOS DE CONFIGURACIÓN DE VERANO/INVIERNO' '' – rolls

Cuestiones relacionadas