2010-01-05 82 views
1

我有一大堆的文件(在数百)有IMG的标签,如下列:匹配具有特定属性的特定标签不被贪婪的VS-2005

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

我试图做Visual Studio 2005中的搜索和替换操作会将标记标识为<img>,但只匹配字符串的border =“0”部分。

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

我使用正则表达式来做到这一点,因为几乎没有任何标记格式正确。

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

我试过以下的正则表达式,但我似乎无法得到它仅匹配边界标签:

(\<img)#[email protected]=\"[0-9]+\" 

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

回答

1

尝试以下方法:(测试)

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

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

+0

@SLaks谢谢,但那不符合任何东西。 – leeand00 2010-01-05 14:46:52

+0

我改变了正则表达式;它应该现在工作。 – SLaks 2010-01-05 14:56:16

+0

好吧,/ 1意味着更换第二场比赛吗? 因为第一个匹配(/ 0)实际上是标签的{\ leeand00 2010-01-05 15:46:46

0

不要太放弃真正的解析器。例如,给出近垃圾输入

<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(<>); 
+0

我试图保持所有这一切在一个Visual Studio宏(仅因为我有其他正则表达式运行该宏来解决其他问题,因为所有这些页面都非常相似...) 虽然没有其他回复我可能会尝试通过从VS宏调用脚本来使用脚本(如果可能的话)。 – leeand00 2010-01-05 15:27:19

+0

我目前没有安装perl ... – leeand00 2010-01-05 15:27:55

相关问题