在vs-2005中将特定标记与特定属性匹配而不贪婪

时间:2010-01-05 14:30:47

标签: html visual-studio regex visual-studio-2005 replace

我有一堆文件(数以百计)有img标签,如下所示:

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

我正在尝试在Visual Studio 2005中执行搜索和替换操作,将标记标识为&lt; img&gt;,但只匹配字符串的border =“0”部分。

我的信念是我需要正则表达式的非贪婪部分来“匹配”(我使用松散的术语)img标签,然后实际匹配border属性,以便我可以将其删除。

我正在使用正则表达式执行此操作,因为几乎没有一个标记格式正确。

我的目标是从所有img标签中删除边框属性。

我已经尝试了以下正则表达式,但我似乎无法使其仅匹配border标记:

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

我认为'#'和'@'是非贪婪的匹配字符,因为这是VS-2005的文档所说的,因此我不认为它会匹配这么多字符;但它匹配从&lt; img一直到border的结尾=“0”属性的所有内容。

2 个答案:

答案 0 :(得分:1)

尝试以下方法:(已测试)

查找:{\<img.#}border=\"[0-9]+\"
替换:\1

请注意,这与标记与属性之间的换行符不匹配。

答案 1 :(得分:0)

不要那么快就放弃真正的解析器。例如,给出

的近垃圾输入
<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(<>);