使用或不使用链接匹配HTML的正则表达式

时间:2015-12-08 13:43:15

标签: regex perl

我希望能够在HTML页面中显示“目标”时显示在页面中:

<h3>
    <a href="http://link">              Target
    </a>            </h3>

我可以指望可靠的间距。我不能指望的是“目标”将始终包含在锚标记中。有时,它看起来像这样:

<h3>
                    Target
                </h3>

我可以匹配第一个版本并使用此正则表达式轻松提取“目标”:

/<h3>\s+<a href=.*>\s+(.*)\s+<\/a>\s+<\/h3>/

但是我很难写出一个能与之匹敌的人。有什么想法吗?

3 个答案:

答案 0 :(得分:9)

不要使用正则表达式来解析HTML。在大多数情况下,它更值得痛苦。使用旨在解析HTML的库。

#!/usr/bin/perl

use v5.16;
use strict;
use warnings;
use HTML::TreeBuilder;

my $data = qq{<body><h3>
<a href="http://link">              Target
</a>            </h3></body>
};

my $otherdata = qq{<body><h3>
              Target
            </h3></body>
};

my $t = HTML::TreeBuilder->new_from_content($data);
say $t->look_down(_tag => "h3")->as_text();


$t = HTML::TreeBuilder->new_from_content($otherdata);
say $t->look_down(_tag => "h3")->as_text();

答案 1 :(得分:0)

为了让我的两分钱,为什么不使用一个体面的Dom库的xpath查询?

//html/body/h3/text()[contains(.,'Target')

实际查询可能会因您的html结构而异。

答案 2 :(得分:-1)

尝试将此作为正则表达式:

<h3>\s+(<a href=.*>)?\s+(.*)\s+(<\/a>)?\s+<\/h3>

它应该符合你的情况。

即使这不是推荐的搜索html的方式,如果这是你想要尝试的,我也不会阻止你。