Regex 如何使用Perl更改HTML文档中指定的字体大小?
我正在修改一些HTML页面,希望使用正则表达式动态增加字体大小。在下面的脚本中,我希望将'8'和'3'转换为'9'和'4',但我分别得到'8++'和'3++'。我有以下资料:Regex 如何使用Perl更改HTML文档中指定的字体大小?,regex,perl,replace,Regex,Perl,Replace,我正在修改一些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 b
#!/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;
#/usr/bin/perl
使用警告;
使用LWP::Simple;
my$content=“这只是一堆文本”;
$content.=“更多文本”;
$content=~s/SIZE=“(\d+”>/SIZE=“$1++”>/g;
打印$content;
我将跳过关于regexp是如何解析HTML的一种糟糕方法的部分,因为有时候一个快速而肮脏的解决方案已经足够好了
不能在这样的字符串中使用运算符。++只是作为纯文本处理(如您所发现的)。您必须使用/e
标志指示替换应作为Perl代码进行计算,然后使用适当的表达式,如:
$content =~ s/SIZE="(\d+)">/'SIZE="' . ($1 + 1) . '">'/eg;
由于两个原因,您不能使用
$1++
。首先,它将在返回值之后执行增量,因此您将用8代替9。第二,<代码> $ 1 <代码>是只读值,增量要修改它。 使用<代码> e <代码>开关执行ReGEX < /P> < P>中的脚本。您应该考虑使用HTML解析器,如:
#!/usr/bin/perl -w
use strict;
sub main{
my $c = qq{<TD><FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="8">this is just a bunch of text</FONT></TD>\n}
. '<TD><FONT STYLE="font-family:Verdana, Geneva, sans-serif" SIZE="3">more text</FONT></TD>';
$c =~ s/(SIZE=\")(\d+)(\")/$_=$2+1;"$1$_$3"/eg;
print "$c\n";
#<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>
}
main();
#/usr/bin/perl
严格使用;使用警告;
使用HTML::TokeParser::Simple;
my$content=“这只是一堆文本”;
$content.=“更多文本”;
my$parser=HTML::TokeParser::Simple->new(\$content);
while(my$token=$parser->get_token){
如果($token->is\u start\u标记('font')){
我的$font\u size=$token->get\u attr('size');
if(定义的$font\U大小){
++$font_size;
$token->set\u attr(size=>$font\u size);
}
}
打印$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>
这只是
一堆文本更多文本
您也可以将其视为使用e
开关来计算正则表达式中的表达式。我忘了您不能将+
与$1
一起使用。已修复。如果可以使用增量运算符(++
),则之前可以将其用于变量(++$1
),但$1
是一个特殊的只读变量,因此会产生错误。
<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>