Perl正则表达式 - 搜索和替换

时间:2011-03-29 12:59:13

标签: regex perl

我无法理解perl搜索并替换为字符串或正则表达式。有人可以帮忙吗?

我有一个包含HTML的文件,我想更改某些项目的类,如果它们存在于给定集合中(在这种情况下是哈希表或验证失败的验证字段)。例如,我有以下内容:

<input name="RMAProcess" type="radio" class="inputnormal" value="Good">

我想将“inputnormal”类更改为值“inputpink”。我要做的是使它匹配整个字符串nomatter,以及属性出现的顺序,例如,以下内容也匹配:

<input name="RMAProcess" type="radio" value="Good" class="inputnormal">

这是因为Dreamweaver有时会在编辑过程中弄乱HTML中属性的顺序,所以我不能依赖它们的固定位置。

所以我最终得到了一些不起作用的东西,例如:

foreach $key ( keys %FAILED ) { 
    $infile =~ s/<input type="radio" name="$key" value="$VALUES{$key}" class="([a-zA-Z]+)"/$1inputpink"/gi;
}

任何人都可以帮我解决这个问题吗?

感谢。

编辑:好的,这种工作方式,假设标签内的属性不会移动:

foreach $key ( keys %FAILED ) {
    $infile =~ s/(<.{4,10}\ type="radio" name="$key".{1,60}class=")([a-zA-Z]+)"/$1inputpink"/gi;
}

现在必须这样做!感谢您的所有回复。

5 个答案:

答案 0 :(得分:3)

您应该使用HTML解析器来解析HTML。我使用HTML::TreeBuilder

答案 1 :(得分:1)

我建议匹配类部分,而不是匹配整个输入标记。我认为这个正则表达式应该起作用....

my $htmlLine = "<input name=\"RMAProcess\" type=\"radio\" class=\"inputnormal\" value=\"Good\">";
$htmlline =~s/class="inputnormal"/class="inputpink"/i;

答案 2 :(得分:0)

如果您有选择,

$ cat file
<input name="RMAProcess" type="radio" class="inputnormal" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputnormal">

$ ruby -ne 'print $_.gsub(/(.*class=")(.[^"]*)(".*)/, "\\1inputpink\\3"  ) ' file
<input name="RMAProcess" type="radio" class="inputpink" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputpink">

它只是替换后引用,所以正则表达式也可以在Perl上下文中使用...

如果您需要确保name="", type="", value="",请使用if,例如

ruby -ne 'print $_.gsub(/(.*class=")(.[^"]*)(".*)/, "\\1inputpink\\3"  ) if /name=/&&/type=/&&/value=/' file

答案 3 :(得分:0)

可能更容易分两步完成:

  1. 将行拆分为属性,并通过在属性上创建哈希或运行多个reg.exps来检查“name = X”和“type = y”。

  2. 如果您想更改该行,您只需使用简单的reg.exp替换类

答案 4 :(得分:0)

如果您无法安装任何模块,可以尝试以下方法:

#!/usr/bin/perl
use Modern::Perl;


my %FAILED = (RMAProcess => 'Good');

while (my $line = <DATA>) {
    chomp($line);
    foreach my $key ( keys %FAILED ) { 
        if ($line =~ /type="radio"/ && $line =~ /name="$key"/ && $line =~/value="$FAILED{$key}"/) {
            $line =~ s/class="([a-zA-Z]+)"/class="inputpink"/;
        }
    }
    say $line;
}

__DATA__
<input name="RMAProcess" type="radio" class="inputnormal" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputnormal">

<强>输出:

<input name="RMAProcess" type="radio" class="inputpink" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputpink">