【问题标题】:Matching a specific tag with a specific attribute without being greedy in vs-2005在 vs-2005 中将特定标签与特定属性匹配而不贪心
【发布时间】:2011-01-01 16:09:40
【问题描述】:

我有一堆文件(数百个)具有如下 img 标签:

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

我正在尝试在 Visual Studio 2005 中进行搜索和替换操作,该操作会将标记标识为 ,但仅匹配字符串的边框 =“0”部分。

我的信念是,我需要正则表达式的非贪婪部分来“匹配”(我松散地使用该术语)img 标签,然后实际匹配边框属性,这样我就可以删除它。

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

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

我尝试了以下正则表达式,但似乎无法让它仅匹配边框标签:

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

我相信 '#' 和 '@' 是非贪婪匹配字符,因为 VS-2005 的文档就是这么说的,因此我认为它不会匹配这么多字符;但是它匹配从

【问题讨论】:

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


    【解决方案1】:

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

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

    请注意,这不会匹配在标签和属性之间有换行符的标签。

    【讨论】:

    • @SLaks 谢谢,但这不匹配任何东西。
    • 啊,好吧,所以 /1 表示替换第二个匹配项,对吗?因为第一个匹配项 (/0) 实际上是标签的 {\
    • \0 表示整个 Find What 文本。 \1 表示第一组。 (是从1开始的)可以点击替换框右侧的小箭头查看。
    • 他标记了除border=属性(大括号)之外的所有内容,所以它在\1中。因此 find 匹配 img 标记及其所有内容直到(包括)border 属性,并将其替换为 img 标记及其所有内容 除了border 属性。
    【解决方案2】:

    不要这么快就放弃真正的解析器。例如,给定近乎垃圾的输入

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

    下面的代码删除了边框属性。

    #! /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(<>);
    

    【讨论】:

    • 我试图将所有这些都保存在 Visual Studio 宏中(只是因为我有其他正则表达式正在运行该宏来解决其他问题,因为所有这些页面都非常相似......)虽然鉴于没有其他回复,我可能会尝试通过从 VS 宏调用它来使用您的脚本(如果可能的话)。
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多