在Perl中替换HTML格式的字符串中的子字符串

时间:2014-05-20 14:22:33

标签: regex perl

我需要替换HTML字符串中的子字符串以及该子字符串之前的所有内容。

这是代码:

#!/usr/bin/perl -w

$str = "
<font color=#6111cc>00820: </font>1: Line1
<font color=#6111cc>00821: </font>2: Line2
<font color=#6111cc>00822: </font>3: Line3
<font color=#6111cc>00823: </font>4: Line4
<font color=#6111cc>00824: </font>5: Line5
<font style=\"color:green\"><b><font color=#6111cc>00882: </font>6: No:6 check</b></font>
<font color=#6600cc>00883: </font>1: Check1
<font color=#6600cc>00883: </font>1: Check2
<font color=#6600cc>00883: </font>1: Check3
";
$replace = "<font style=\"color:green\"><b><font color=#6111cc>00882: </font>6: No:6 check</b></font>";

$str =~ s/(.*)\Q$replace\E//;

print "str: $str\n";

我需要在之前替换以下子字符串和所有内容:

<font style=\"color:green\"><b><font color=#6111cc>00882: </font>6: No:6 check</b></font>

我需要的结果是:

str = "<font color=#6600cc>00883: </font>1: Check1
       <font color=#6600cc>00883: </font>1: Check2
       <font color=#6600cc>00883: </font>1: Check3";

我尝试的代码无法正常工作,它只替换了关键行,而不是该行之前的所有内容。输出:

<font color=#6111cc>00820: </font>1: Line1
<font color=#6111cc>00821: </font>2: Line2
<font color=#6111cc>00822: </font>3: Line3
<font color=#6111cc>00823: </font>4: Line4
<font color=#6111cc>00824: </font>5: Line5

<font color=#6600cc>00883: </font>1: Check1
<font color=#6600cc>00883: </font>1: Check2
<font color=#6600cc>00883: </font>1: Check3

2 个答案:

答案 0 :(得分:0)

你很亲密;你需要'将换行视为常规字符'单行修饰符,s

$str =~ s/(.*)\Q$replace\E//s;

请参阅:Perl regex modifiers - 或perldoc perlre

(输出值开头的换行符是匹配文本后的换行符。我不得不考虑几秒钟。)

在所有Perl脚本中使用use strict;use warnings;是个好主意(尽管对您的问题不重要)。

答案 1 :(得分:0)

您的代码会删除同一行上的所有内容,直至并包含$replace的内容,因为.匹配除了换行符之外的所有内容。

如果您还要删除第1行到第5行,则需要在您的子代码中使用/s修饰符,这会更改.以匹配任何字符。

您还应该始终 use strictuse warnings(而不是-w命令行选项)在每个Perl程序的顶部。

使用单引号无需转义双引号。

这就是您的代码应该是什么样子

#!/usr/bin/perl

use strict;
use warnings;

my $str = <<'__END_HTML__';
<font color=#6111cc>00820: </font>1: Line1
<font color=#6111cc>00821: </font>2: Line2
<font color=#6111cc>00822: </font>3: Line3
<font color=#6111cc>00823: </font>4: Line4
<font color=#6111cc>00824: </font>5: Line5
<font style="color:green"><b><font color=#6111cc>00882: </font>6: No:6 check</b></font>
<font color=#6600cc>00883: </font>1: Check1
<font color=#6600cc>00883: </font>1: Check2
<font color=#6600cc>00883: </font>1: Check3
__END_HTML__

my $replace = '<font style="color:green"><b><font color=#6111cc>00882: </font>6: No:6 check</b></font>';

$str =~ s/(.*)\Q$replace\E//s;

print "str: $str\n";