我遇到了 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::TreeBuilder
和 look_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/