2010-07-24 4 views
2

Je modifie certaines pages HTML et je souhaite augmenter dynamiquement la taille de la police avec une regex. Dans mon script ci-dessous, je veux que le '8' et le '3' se transforment en '9' et '4' mais je reçois '8 ++' et '3 ++', respectivement. Je donne les résultats suivants:Comment puis-je changer la taille de la police spécifiée dans un document HTML en utilisant Perl?

#!/usr/bin/perl 
use warnings; 
use LWP::Simple; 

my $content = "<TD><FONT STYLE=\"font-family:Verdana, Geneva, sans-serif\" SIZE=\"8\">this is just a bunch of text</FONT></TD>"; 
$content .= "<TD><FONT STYLE=\"font-family:Verdana, Geneva, sans-serif\" SIZE=\"3\">more text</FONT></TD>"; 

$content=~s/SIZE="(\d+)">/SIZE="$1++">/g; 

print $content;  

Répondre

4

Je vais sauter la partie sur la façon dont les expressions régulières sont une mauvaise façon d'analyser HTML, parce que parfois une solution rapide et sale est assez bon.

Vous ne pouvez pas utiliser un opérateur dans une chaîne comme celle-ci. Le ++ est juste traité comme du texte brut (comme vous l'avez trouvé). Vous devez utiliser le drapeau /e pour indiquer que le remplacement doit être évaluée sous forme de code Perl, puis utilisez l'expression appropriée, comme:

$content =~ s/SIZE="(\d+)">/'SIZE="' . ($1 + 1) . '">'/eg; 

Vous ne pouvez pas utiliser $1++ pour deux raisons. D'abord, il ferait l'incrément après retournant la valeur, donc vous remplaceriez 8 avec 8 au lieu de 9. Deuxièmement, $1 est une valeur en lecture seule, et l'incrément voudrait le modifier.

+1

J'ai oublié que vous ne pouvez pas utiliser "++" avec "$ 1". Fixé. – cjm

+0

Si vous pouviez utiliser l'opérateur increment ('++'), vous l'utiliseriez avant pour la variable ('++ $ 1'), mais' $ 1' est une variable spéciale en lecture seule, ce qui produirait une erreur. – vol7ron

1

utiliser le commutateur e pour exécuter des scripts dans la regex

+1

Vous pouvez également penser à l'utilisation du commutateur 'e' pour évaluer les expressions à l'intérieur de la regex. – mob

1
#!/usr/bin/perl -w  

use strict;  

    sub main{  
     my $c = qq{&lt;TD>&lt;FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="8">this is just a bunch of text&lt;/FONT>&lt;/TD>\n} 
      . '&lt;TD>&lt;FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="3">more text&lt;/FONT>&lt;/TD>'; 

     $c =~ s/(SIZE=\")(\d+)(\")/$_=$2+1;"$1$_$3"/eg; 

     print "$c\n";  
     #&lt;TD>&lt;FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="9">this is just a bunch of text&lt;/FONT>&lt;/TD> 
     #&lt;TD>&lt;FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="4">more text&lt;/FONT>&lt;/TD> 
    }  

    main();  
1

Vous devriez envisager d'utiliser un analyseur HTML tel que HTML::TokeParser::Simple:

#!/usr/bin/perl 

use strict; use warnings; 

use HTML::TokeParser::Simple; 

my $content = "<TD><FONT STYLE=\"font-family:Verdana, Geneva, sans-serif\" SIZE=\"8\">this is just a bunch of text</FONT></TD>"; 
$content .= "<TD><FONT STYLE=\"font-family:Verdana, Geneva, sans-serif\" SIZE=\"3\">more text</FONT></TD>"; 

my $parser = HTML::TokeParser::Simple->new(\$content); 

while (my $token = $parser->get_token) { 
    if ($token->is_start_tag('font')) { 
     my $font_size = $token->get_attr('size'); 
     if (defined $font_size) { 
      ++ $font_size; 
      $token->set_attr(size => $font_size); 
     } 
    } 
    print $token->rewrite_tag->as_is; 
} 

Sortie:

<td><font style="font-family:Verdana, Geneva, sans-serif" size="9">this is just 
a bunch of text</font></td><td><font style="font-family:Verdana, Geneva, 
sans-serif" size="4">more text</font></td> 
Questions connexes