正则表达式匹配仅有时存在的 `rel` 元素的 `img` 属性

标签 regex perl

我遇到了 Perl 正则表达式的问题。在 img 元素上,我希望将 src 属性与以 /file?id 开头的值以及任何 class 相匹配alt 属性。我想忽略有时存在有时不存在的 rel 属性,如下所示:

<img rel="lightbox[45451]" src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">    

<img  src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">

我的问题是如何处理可选的 rel 属性。

我正在尝试使用此方法来匹配 rel 属性:

(?!\s+(rel)="([^"]+)")

它在没有 rel 属性时有效,但在 img 具有 rel 属性时失败。

最佳答案

使用正确的 HTML 解析器可以轻松完成此操作。该程序演示了如何使用 HTML::TreeBuilderlook_down 方法。

它正在搜索所有元素:

  • 标签名称“img”
  • 与正则表达式 qr|^/file\?id=| 匹配的 src 属性
  • 与 null 正则表达式匹配的 class 属性(即具有任意值的类属性)
  • 与 null 正则表达式匹配的 alt 属性

一旦找到元素,您就不会说出想要对它们做什么。此代码仅使用 as_HTML 来显示它们。

use strict;
use warnings;

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder::XPath->new_from_file(\*DATA);
my @images = $html->look_down(
  _tag => 'img',
  src => qr|^/file\?id=|,
  class => qr//,
  alt => qr//
);
print $_->as_HTML, "\n" for @images;

__DATA__
<html>
  <head>
    <title>Page title</title>
  </head.
  <body>
    <img rel="lightbox[45451]" src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">    
    <img  src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">
    <img  src="/file" class="bbc_img" alt="myimagess.jpg"> /* mismatch id="" */
    <img  src="/file?id=13166" alt="myimagess.jpg">        /* no class="" */
    <img  src="/file?id=13166" class="bbc_img">            /* no alt="" */
  </body>
</html>

输出

<img alt="myimagess.jpg" class="bbc_img" rel="lightbox[45451]" src="/file?id=13166" />
<img alt="myimagess.jpg" class="bbc_img" src="/file?id=13166" />

关于正则表达式匹配仅有时存在的 `rel` 元素的 `img` 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17740729/

相关文章:

java - 如何编写在指定字符串处停止的正则表达式?

c++ - 两种链接 boost 正则表达式的方法出错

python - 删除 pandas 系列中仅是标点符号的单词

json - 如何将变量作为方法传递给 Perl 哈希引用?

html - 在 HTML 中包装表格数据

Perl:测试输入阅读器?

perl - 这个微不足道的功能傻吗?

python - 在 Python 中从字符串中删除反斜杠

python - 在python中查找带有正则表达式的字符串

perl - 如何在 Perl 中获得回溯?