Сопоставление определенного тега с определенным атрибутом, не будучи жадным в vs-2005 - PullRequest
1 голос
/ 05 января 2010

У меня есть куча файлов (в сотнях), которые имеют теги img, подобные следующим:

<img randomAttr1="randomVal" randomAttr2="valueRand" border="0" 
     randomAttr3="someRandValue">

Я пытаюсь выполнить операцию поиска и замены в Visual Studio 2005, которая идентифицирует тег как image, но соответствует только значению границы = "0" строки.

Я считаю, что мне нужна не жадная часть регулярного выражения, чтобы "сопоставить" (и я свободно использую термин) тег img, а затем фактически сопоставить атрибут border, чтобы я мог удалить его. *

Я использую регулярные выражения, чтобы сделать это, так как почти ни одна из разметки не сформирована правильно.

Моя цель здесь состоит в том, чтобы удалить атрибуты границ из всех тегов img.

Я пробовал следующее регулярное выражение, но я не могу заставить его соответствовать только тегу border:

(\<img)#.@border=\"[0-9]+\"

Я считаю, что '#' и '@' не совпадают с жадными символами, поскольку так говорится в документации для VS-2005, и поэтому я не думаю, что они будут соответствовать такому количеству символов; однако он соответствует всему от image

Ответы [ 2 ]

1 голос
/ 05 января 2010

Попробуйте следующее: (проверено)

Найти: {\<img.#}border=\"[0-9]+\"
Заменить: \1

Обратите внимание, что теги не будут совпадать с новой строкой между тегом и атрибутом.

0 голосов
/ 05 января 2010

Не спешите сдаваться на реальных парсерах. Например, при вводе почти мусора

<TagSoup>lskdjfs
sdfkljs sdfalkjdfs
<img randomAttr1=randomVal randomAttr2="valueRand" border="0" 
     randomAttr3="someRandValue">
sdklfjsdflkj
<img randomAttr1="randomVal" randomAttr2="valueRand123"
     randomAttr3=someRandValue456>

приведенный ниже код удаляет атрибут border.

#! /usr/bin/perl

use warnings;
use strict;

use HTML::Parser;

sub start {
  my($tag,$attr,$attrseq,$text,$skipped) = @_;

  print $skipped;
  unless ($tag eq "img") {
    print $text;
    return;
  }

  my $changed = 0;
  my @seq;
  for (@$attrseq) {
    if (lc($_) eq "border" && $attr->{$_} =~ /^\s*0+\s*$/) {
      delete $attr->{$_};
      $changed = 1;
    }
    else {
      push @seq => $_;
    }
  }

  if ($changed) {
    print "<$tag ",
            join(" " => map qq[$_="$attr->{$_}"], @seq),
          ">";
  }
  else {
    print $text;
  }
}

die "Usage: $0 html-file\n" unless @ARGV == 1;
my $p = HTML::Parser->new(
  api_version => 3,
  marked_sections => 1,
  case_sensitive => 1,
  start_h => [ \&start => "tag, attr, attrseq, text, skipped_text" ],
  end_h => [ sub { print @_ } => "skipped_text, text" ],
);

undef $/;
$p->parse(<>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...