首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用regex在html中查找重复的id键。

使用regex在html中查找重复的id键。
EN

Stack Overflow用户
提问于 2015-04-16 17:00:54
回答 3查看 939关注 0票数 3

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

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

代码语言:javascript
运行
复制
<img id="key"><img id="key">

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

代码语言:javascript
运行
复制
<img id="key">
<img id="key2">
<img id="key">
<img id="key3">
<img id="key2">
<img id="key">

注意:我只是作为一个例子使用img标记,html文件更复杂。

EN

回答 3

Stack Overflow用户

发布于 2015-04-16 17:35:52

不管出于什么原因,崇高的.匹配器不包括换行,所以您需要这样做:id=("[^"]+")(.|\n)*id=\1

不过,老实说,我宁愿使用Unix实用程序:

代码语言:javascript
运行
复制
grep -Eo 'id="[^"]+"' filename | sort | uniq -c

  3 id="key"
  2 id="key2"
  1 id="key3"

如果这些是完整的HTML文档,您可以使用W3的HTML验证器来捕获dups和其他错误。

票数 2
EN

Stack Overflow用户

发布于 2015-04-16 17:43:07

如果您所要做的只是查找重复的it,那么下面是我编写的一个小小的Perl程序,它可以做到这一点:

代码语言:javascript
运行
复制
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“。然后像这样调用它:

代码语言:javascript
运行
复制
perl dupes.pl file.html

如果我在你的样本上运行它,它会告诉我:

代码语言:javascript
运行
复制
key shows up 3 times
key2 shows up 2 times

它有一些限制,比如它找不到id=fooid='foo',但可能会帮助您在未来的道路上前进。

票数 0
EN

Stack Overflow用户

发布于 2015-04-16 18:37:40

崇高文本的regex搜索似乎默认为多行模式,这意味着.将不匹配换行。可以使用模式修饰符使用单行模式使.匹配新行:

代码语言:javascript
运行
复制
(?s)id=("[^"]+").*id=\1

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

但是,这个regex在查找所有重复键方面做得很差,因为它只能在示例key中匹配从keykey。您可能需要一个多步骤的过程,以找到所有的钥匙,可以编程。正如其他人所显示的,您需要(1)首先提取所有ids,然后(2)对它们进行分组并计数,以确定哪些ids是dupe。

或者,手动方法是将regex模式更改为查找重复in,然后在Sublime文本中找到下一个匹配项:

代码语言:javascript
运行
复制
(?s)id=("[^"]+")(?=.*id=\1)

使用上面的模式和示例HTML,您将看到突出显示的下列匹配:

代码语言:javascript
运行
复制
<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">

请注意,前瞻并没有显示文件后面的实际欺骗。它将在第一次出现时停止,并表明稍后会出现欺骗。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29681442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档