使用正则表达式在html中查找重复的id键
给定一个html文件,如何使用正则表达式查找是否存在重复的id值?我需要它在SublimiteText上搜索它 例如:使用使用正则表达式在html中查找重复的id键,html,regex,html-parsing,sublimetext,Html,Regex,Html Parsing,Sublimetext,给定一个html文件,如何使用正则表达式查找是否存在重复的id值?我需要它在SublimiteText上搜索它 例如:使用id=(“[^”]*”.*id=\1我可以在同一行中找到重复的id键 <img id="key"><img id="key"> 注意:我使用img标记只是作为一个例子,html文件更复杂 无论出于何种原因,Sublime的匹配器不包含换行符,因此您需要执行以下操作:id=(“[^”]+”)(.|\n)*id=\1 老实说,我宁愿使用Unix实用程序:
id=(“[^”]*”.*id=\1
我可以在同一行中找到重复的id键
<img id="key"><img id="key">
注意:我使用img标记只是作为一个例子,html文件更复杂
无论出于何种原因,Sublime的
匹配器不包含换行符,因此您需要执行以下操作:id=(“[^”]+”)(.|\n)*id=\1
老实说,我宁愿使用Unix实用程序:
grep -Eo 'id="[^"]+"' filename | sort | uniq -c
3 id="key"
2 id="key2"
1 id="key3"
如果这些是完整的HTML文档,您可以使用来捕获DUP和其他错误。如果您只想找到重复的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;
}
如果我在你的样品上运行它,它会告诉我:
key shows up 3 times
key2 shows up 2 times
它有一些限制,比如它找不到
id=foo
或id='foo'
,但可能会帮助您解决问题。升华文本的正则表达式搜索默认为多行模式,这意味着
不会匹配换行符。您可以使用模式修改器使用单行模式使
匹配新行:
(?s)id=("[^"]+").*id=\1
(?s)
是单线模式修改器
但是,这个正则表达式在查找所有重复键方面做得很差,因为它只会在示例HTML中从key
匹配到key
。您可能需要一个多步骤的过程来查找所有可以编程的钥匙。如其他人所示,您需要(1)首先取出所有ID,然后(2)将它们分组并计数,以确定哪些是重复
或者,手动方法是更改正则表达式模式以查找重复ID,然后您可以在Sublime文本中找到下一个匹配项:
(?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">
以下是用于查找重复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]
}'
awk])/,”,$2);
如果(NF==2)
imgs[$2]++;
}
结束{
用于(img中的img)
printf“Img ID:%s\t出现了%d次\n”,Img,imgs[Img]
}'
也许你可以将你的HTML发送到一个验证HTML并警告你重复id的工具中。你应该使用DOM解析器(不确定SublimitText是否有)。还要记住这些id:id=abc id='abc'id=“abc”在你的正则表达式中是可选的,在html5中,id也可以是id,id;所以while(/id=“([^”]+)”/g){应该是while(/\bid=\S+/ig){然后从id中删除(双引号/单引号,如果有的话)。
<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">
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]
}'