2010-01-05 44 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