我无法理解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;
}
现在必须这样做!感谢您的所有回复。
答案 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)
可能更容易分两步完成:
将行拆分为属性,并通过在属性上创建哈希或运行多个reg.exps来检查“name = X”和“type = y”。
如果您想更改该行,您只需使用简单的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">