使用正则表达式在html中查找重复的id键

时间:2015-04-16 17:00:55

标签: html regex html-parsing sublimetext

给定一个html文件,如何使用正则表达式查找是否存在重复的id值?我需要它在SublimeText上搜索它。

例如:使用id=("[^"]*").*id=\1我可以在同一行中找到重复的id键

<img id="key"><img id="key">

但我需要的是在多行和不同的键对中执行相同的操作。在这种情况下,例如keykey2是重复的ID。

<img id="key">
<img id="key2">
<img id="key">
<img id="key3">
<img id="key2">
<img id="key">
  

注意:我只使用img标签作为示例,html文件更复杂。

4 个答案:

答案 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=fooid='foo',但可能会帮助您顺利完成。

答案 2 :(得分:0)

Sublime Text的正则表达式搜索似乎默认为多行模式,这意味着.不匹配换行符。您可以使用模式修改器使用单行模式使.匹配新行:

(?s)id=("[^"]+").*id=\1

(?s)是单行模式修饰符。

但是,此正则表达式在查找所有重复键方面做得很差,因为它只会与示例HTML中的keykey匹配。您可能需要一个多步骤的过程来查找可以编程的所有键。正如其他人已经表明的那样,你需要(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] 
    }'