Regex Perl正则表达式-搜索和替换
我无法在字符串或正则表达式中理解perl搜索和替换。有人能帮忙吗 我有一个包含HTML的文件,我想更改某些项目的类别,如果它们在给定的集合中存在(在本例中是哈希表或验证失败的验证字段)。例如,我有以下几点:Regex Perl正则表达式-搜索和替换,regex,perl,Regex,Perl,我无法在字符串或正则表达式中理解perl搜索和替换。有人能帮忙吗 我有一个包含HTML的文件,我想更改某些项目的类别,如果它们在给定的集合中存在(在本例中是哈希表或验证失败的验证字段)。例如,我有以下几点: <input name="RMAProcess" type="radio" class="inputnormal" value="Good"> 我想将“inputnormal”类更改为值“inputpink”。我试图做的是使其与整个字符串匹配,而不管属性的显示顺序如何,这样
<input name="RMAProcess" type="radio" class="inputnormal" value="Good">
我想将“inputnormal”类更改为值“inputpink”。我试图做的是使其与整个字符串匹配,而不管属性的显示顺序如何,这样,例如,以下内容也将匹配:
<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(key%失败){
$infle=~s/如果您有选择
$ 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">
如果你有选择
$ 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">
您应该使用HTML解析器来解析HTML。我使用。您应该使用HTML解析器来解析HTML。我使用。通过两个步骤可能更容易做到这一点:
通过在属性上创建哈希或运行几个reg.exp,将行拆分为属性并检查“name=X”和“type=y”
如果您想更改行,您可以用一个简单的reg.exp替换类
通过两个步骤可能更容易做到这一点:
通过在属性上创建哈希或运行几个reg.exp,将行拆分为属性并检查“name=X”和“type=y”
如果您想更改行,您可以用一个简单的reg.exp替换类
如果无法安装任何模块,可以尝试以下操作:
#!/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">
!/usr/bin/perl
使用Modern::Perl;
我的%FAILED=(RMAProcess=>“Good”);
while(我的$line=){
chomp($line);
foreach my$key(key%失败){
如果($line=~/type=“radio”/&&$line=~/name=“$key”/&&$line=~/value=“$FAILED{$key}”/){
$line=~s/class=“([a-zA-Z]+)”/class=“inputpink”/;
}
}
比如说$line;
}
__资料__
输出:
<input name="RMAProcess" type="radio" class="inputpink" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputpink">
如果您无法安装任何模块,可以尝试以下方法:
#!/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">
!/usr/bin/perl
使用Modern::Perl;
我的%FAILED=(RMAProcess=>“Good”);
while(我的$line=){
chomp($line);
foreach my$key(key%失败){
如果($line=~/type=“radio”/&&$line=~/name=“$key”/&&$line=~/value=“$FAILED{$key}”/){
$line=~s/class=“([a-zA-Z]+)”/class=“inputpink”/;
}
}
比如说$line;
}
__资料__
输出:
<input name="RMAProcess" type="radio" class="inputpink" value="Good">
<input name="RMAProcess" type="radio" value="Good" class="inputpink">
我建议匹配类部分,而不是匹配整个输入标记。我认为这个正则表达式应该可以工作
my $htmlLine = "<input name=\"RMAProcess\" type=\"radio\" class=\"inputnormal\" value=\"Good\">";
$htmlline =~s/class="inputnormal"/class="inputpink"/i;
my$htmlLine=”“;
$HTMLINE=~s/class=“inputnormal”/class=“inputpink”/i;
我建议匹配类部分,而不是匹配整个输入标记。我认为这个正则表达式应该可以工作
my $htmlLine = "<input name=\"RMAProcess\" type=\"radio\" class=\"inputnormal\" value=\"Good\">";
$htmlline =~s/class="inputnormal"/class="inputpink"/i;
my$htmlLine=”“;
$HTMLINE=~s/class=“inputnormal”/class=“inputpink”/i;
< /代码>正则表达式在这些任务中真的很糟糕。我会推荐一些HTML解析器来解决这个问题。不幸的是,我对Perl不太了解。建议鲁滨孙:你的意思是你不能在你的机器上安装任何Perl模块?检查你是否有或者。这些模块是预先安装的,你可以使用它们。se HTML而不使用正则表达式,正如其他评论中指出的,这不是一个好主意。@Robinson:我理解。但是,如果这两个模块中的一个已经安装,请在托管空间的计算机上进行检查。您可以从命令提示符处执行此操作(假设您可以在远程计算机上打开提示符,可能是ssh):doperl-MHTML::Parser
:如果安装了该模块,您没有收到任何错误消息,并且您使用CTRL+C
退出perl解释器。对于另一个模块perl-MHTML::TreeBuilder
@Robinson>也一样:请阅读此内容,并查看其中任何选项是否有帮助:既然您说您的主机是基于基本主机的,我假设您可以运行CGI可以使用脚本检查已安装的模块,例如print“内容类型:text/plain\n\n;eval{print”检查HTML::Parser\n;require HTML::Parser;print“Found HTML::Parser\n”;};eval{print”检查HTML::TreeBuilder\n;require HTML::TreeBuilder;print“Found HTML::TreeBuilder\n”}
添加合适的#!
行等。正则表达式在这类任务中非常糟糕。我建议使用某种HTML解析器。不幸的是,我对Perl的了解不够,无法提出建议。@Robinson:你的意思是不能在你的机器上安装任何Perl模块?检查你是否有或。这些模块可能是预安装,您可以使用它们来解析HTML,而无需使用正则表达式,正如其他注释中指出的,这不是一个好主意。@Robinson:我理解。但是,如果这两个模块中的一个已经安装,请在主机空间上检查计算机。您可以通过命令提示符执行此操作(假设您可以在远程计算机上打开提示符,可能是ssh):doperl-MHTML::Parser
:如果安装了该模块,您没有收到任何错误消息,并且您使用CTRL+C
退出perl解释器。对于另一个模块perl-MHTML::TreeBuilder
@Robinson>也一样:请阅读此内容,并查看其中任何选项是否有帮助:既然您说您的主机是基于基本主机的,我假设您可以运行CGI可以使用脚本检查已安装的模块,例如print“内容类型:text/plain\n\n;eval{print”检查HTML::Parser\n;require HTML::Parser;print“Found HTML::Parser\n”;};eval{print”检查HTML::TreeBuilder\n;require HTML::TreeBuilder;print“Found HTML::TreeBuilder\n”}
添加合适的!
行等。如果我错了,请纠正我,但您只是在class=“x”上匹配。我想在name=“x”type=“y”value=“z”上匹配,然后替换