适合这场比赛的正则表达式?

时间:2014-05-28 16:39:35

标签: regex perl preg-match

使用perl正则表达式,我正在尝试抓取网站的html,然后在以下代码中匹配URL和版本号。无论我使用什么,它都不匹配字符串。

要匹配的字符串: <a itemprop='downloadUrl' href='http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip'>Download Version 5.0.9</a> </p>

我需要获取形成href = value和Version number的字符串部分。

我试过了:

if($page =~ /.*<a itemprop='downloadUrl' href='(.*)' Download Version (.*)<\/a>/) 
        {
            $url = $1;
            $version = $2;

$ page包含一个块:

<div id="plugin-description">
    <p itemprop="description" class="shortdesc">
        Wordfence Security is a free enterprise class security and performance plugin that makes your site up to 50 times faster and more secure.   </p>
    <div class="description-right">
                <p class="button">
            <a itemprop='downloadUrl' href='http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip'>Download Version 5.0.9</a>       </p>
<meta itemprop="softwareVersion" content="5.0.9" />
<meta itemprop="fileFormat" content="application/zip" />

                    </div>
</div>

2 个答案:

答案 0 :(得分:3)

您的正则表达式不匹配,因为您错过了标记的正确锚点>,并且需要在Download之前删除前导空格。

if ($page =~ /.*<a itemprop='downloadUrl' href='(.*)'>Download Version (.*)<\/a>/)
                                                     ^^

注意:对于非贪婪匹配,您应该使用.* ?跟踪所有内容。

答案 1 :(得分:1)

使用实际的HTML解析器(如Mojo::DOMMojo::UserAgent)来解析HTML。这个框架在Mojocast Episode 5的所有权力都有一个很好的8分钟视频。

use strict;
use warnings;

use Mojo::UserAgent;

my $url = "https://wordpress.org/plugins/wordfence/";

my $ua = Mojo::UserAgent->new;
my $dom = $ua->get($url)->res->dom;

# Process all links
for my $link ($dom->find('a[itemprop=downloadUrl]')->each) {
    if ($link->text =~ /Download Version (.*)/) {
        print "$link->{href} -> $1";
    }
}

输出:

http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip -> 5.0.9

注意:你的正则表达式中的一个缺陷是你在任何地方使用贪婪的匹配。您应该将所有.*更改为.*?