Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式-搜索和替换_Regex_Perl - Fatal编程技术网

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

Regex Perl正则表达式-搜索和替换,regex,perl,Regex,Perl,我无法在字符串或正则表达式中理解perl搜索和替换。有人能帮忙吗 我有一个包含HTML的文件,我想更改某些项目的类别,如果它们在给定的集合中存在(在本例中是哈希表或验证失败的验证字段)。例如,我有以下几点: <input name="RMAProcess" type="radio" class="inputnormal" value="Good"> 我想将“inputnormal”类更改为值“inputpink”。我试图做的是使其与整个字符串匹配,而不管属性的显示顺序如何,这样

我无法在字符串或正则表达式中理解perl搜索和替换。有人能帮忙吗

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

<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):do
    perl-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):do
    perl-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”上匹配,然后替换