我有一堆文件(数以百计)有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”属性的所有内容。
答案 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(<>);