Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用Perl更改HTML文档中指定的字体大小?_Regex_Perl_Replace - Fatal编程技术网

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

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

我正在修改一些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;     
#/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{&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();    
#/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>