如何使用Perl更改HTML文档中指定的字体大小?

7lrncoxx  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(194)

我正在修改一些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;
tp5buhyn

tp5buhyn1#

我将跳过有关regexp如何是解析HTML的坏方法的部分,因为有时快速而肮脏的解决方案已经足够好了。
你不能在这样的字符串中使用运算符。++只被当作纯文本(正如你所发现的)。你必须使用/e标志来指示替换应该作为Perl代码来计算,然后使用适当的表达式,比如:

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

不能使用$1++有两个原因。第一,它会在返回值后执行增量,因此您会用8而不是9替换8。第二,$1是只读值,增量会修改它。

wtzytmuj

wtzytmuj2#

您应该考虑使用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>
gupuwyp2

gupuwyp23#

使用e修饰符/标志在正则表达式中执行脚本,例如

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

sdnqo3pr4#

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

相关问题