Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式在html中查找重复的id键_Html_Regex_Html Parsing_Sublimetext - Fatal编程技术网

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

使用正则表达式在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实用程序:

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

例如:使用
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] 
    }'