我需要替换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
答案 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 strict
和use 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";