Perl регулярное выражение - поиск и замена - PullRequest
0 голосов
/ 29 марта 2011

Я не могу разобраться с поиском и заменой 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 ( keys %FAILED ) {
    $infile =~ s/(<.{4,10}\ type="radio" name="$key".{1,60}class=")([a-zA-Z]+)"/$1inputpink"/gi;
}

Это нужно сделать сейчас! Спасибо за все ваши ответы.

Ответы [ 5 ]

3 голосов
/ 29 марта 2011

Вы должны использовать анализатор HTML для анализа HTML.Я использую HTML :: TreeBuilder .

1 голос
/ 29 марта 2011

Вместо сопоставления всего входного тега, я рекомендую сопоставить часть класса. Это регулярное выражение должно работать, я думаю ....

my $htmlLine = "<input name=\"RMAProcess\" type=\"radio\" class=\"inputnormal\" value=\"Good\">";
$htmlline =~s/class="inputnormal"/class="inputpink"/i;
0 голосов
/ 29 марта 2011

Если вы не можете установить какой-либо модуль, вы можете попробовать что-то вроде:

#!/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">
0 голосов
/ 29 марта 2011

Вероятно, проще сделать это в два шага:

  1. Разделить строку на атрибуты и проверить, если "name = X" и "type = y", создав хэш для атрибутовили запуск нескольких reg.exps.

  2. Если вы хотите изменить строку, вы можете просто заменить класс на простой reg.exp

0 голосов
/ 29 марта 2011

Если у вас есть выбор,

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...