Как я могу изменить размер шрифта, указанный в документе HTML, используя Perl? - PullRequest
2 голосов
/ 25 июля 2010

Я изменяю некоторые HTML-страницы и хочу динамически увеличивать размер шрифта с помощью регулярных выражений.В моем сценарии ниже я хочу, чтобы «8» и «3» превратились в «9» и «4», но я получаю «8 ++» и «3 ++» соответственно.У меня есть следующее:

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

Ответы [ 4 ]

4 голосов
/ 25 июля 2010

Я просто пропущу часть о том, что регулярные выражения являются плохим способом анализа HTML, потому что иногда быстрое и грязное решение достаточно хорошо.

Вы не можете использовать оператор внутри строкикак это.++ просто обрабатывается как простой текст (как вы нашли).Вы должны использовать флаг /e, чтобы указать, что замена должна быть оценена как код Perl, а затем использовать соответствующее выражение, например:

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

Вы не можете использовать $1++ по двум причинам.,Во-первых, он будет делать приращение после возврата значения, поэтому вы замените 8 на 8 вместо 9. Во-вторых, $1 - это значение только для чтения, и приращение захочет изменитьэто.

1 голос
/ 25 июля 2010

Вы должны рассмотреть возможность использования анализатора HTML, такого как 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;
}

Выход:

<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>
1 голос
/ 25 июля 2010
#!/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 голос
/ 25 июля 2010

используйте переключатель e для выполнения сценариев внутри регулярного выражения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...