给定一个html文件,如何使用正则表达式查找是否存在重复的id值?我需要它在SublimeText上搜索它。
例如:使用id=("[^"]*").*id=\1
我可以在同一行中找到重复的id键
<img id="key"><img id="key">
但我需要的是在多行和不同的键对中执行相同的操作。在这种情况下,例如key
和key2
是重复的ID。
<img id="key">
<img id="key2">
<img id="key">
<img id="key3">
<img id="key2">
<img id="key">
注意:我只使用img标签作为示例,html文件更复杂。
答案 0 :(得分:1)
无论出于何种原因,Sublime的.
匹配器都不包含换行符,因此您需要执行以下操作:id=("[^"]+")(.|\n)*id=\1
老实说,我宁愿使用Unix实用程序:
grep -Eo 'id="[^"]+"' filename | sort | uniq -c
3 id="key"
2 id="key2"
1 id="key3"
如果这些是完整的HTML文档,您可以使用w3's HTML validator来捕获重复项以及其他错误。
答案 1 :(得分:0)
如果你要做的就是找到重复的ID,那么这里有一个小的Perl程序,我会把它拼凑起来:
use strict;
use warnings;
my %ids;
while ( <> ) {
while ( /id="([^"]+)"/g ) {
++$ids{$1};
}
}
while ( my ($id,$count) = each %ids ) {
print "$id shows up $count times\n" if $count > 1;
}
称之为“dupes.pl”。然后像这样调用它:
perl dupes.pl file.html
如果我在你的样品上运行它,它会告诉我:
key shows up 3 times
key2 shows up 2 times
它有一些限制,例如找不到id=foo
或id='foo'
,但可能会帮助您顺利完成。
答案 2 :(得分:0)
Sublime Text的正则表达式搜索似乎默认为多行模式,这意味着.
不匹配换行符。您可以使用模式修改器使用单行模式使.
匹配新行:
(?s)id=("[^"]+").*id=\1
(?s)
是单行模式修饰符。
但是,此正则表达式在查找所有重复键方面做得很差,因为它只会与示例HTML中的key
到key
匹配。您可能需要一个多步骤的过程来查找可以编程的所有键。正如其他人已经表明的那样,你需要(1)首先拉出所有的id,然后(2)将它们分组并计算它们以确定哪些是欺骗。
或者,手动方法是将正则表达式模式更改为预测重复ID,然后您可以在Sublime Text中找到下一个匹配项:
(?s)id=("[^"]+")(?=.*id=\1)
使用上述模式和您的示例HTML,您会看到以下匹配项突出显示:
<img id="key"> <-- highlighted (dupe found on 3rd line)
<img id="key2"> <-- highlighted (dupe found on 5th line)
<img id="key"> <-- highlighted (next dupe found on last line)
<img id="key3">
<img id="key2">
<img id="key">
请注意,前瞻不会在文件后面显示实际的欺骗行为。它将在第一次出现时停止并指示稍后会出现欺骗。
答案 3 :(得分:0)
以下是查找重复的img id值的AWK脚本:
awk < file.txt
'{
$2 = tolower($2);
gsub(/(id|["=>])/, "", $2);
if (NF == 2)
imgs[$2]++;
}
END {
for (img in imgs)
printf "Img ID: %s\t appears %d times\n", img, imgs[img]
}'