在Perl中,如何用绝对URL替换img标签的src属性中的相对URL?

时间:2012-07-03 11:39:56

标签: perl html-parsing

我想在src代码中找到并替换(来自html页面)所有img个属性。例如,采取

<img width="25" height="13" border="0" src="/images/flags/de.png">

并更改src属性

我目前正在使用:

$info{content}=~s!(<img[^>]src=")(/.*)"!$http://$dest$2!gi;

其中$dest是我要放置的网址。

我的问题是它找到第一次出现而不是后续出现。

/g选项是否应该替换所有出现次数?

我确定正则表达式适用于下一次出现,因为如果我再次添加我的代码行,则会替换下一次出现。

4 个答案:

答案 0 :(得分:4)

您希望将URI解析为绝对URI。使用强大的HTML解析器:

use strictures;
use URI qw();
use Web::Query qw();

my $dest = 'http://example.com/blah/';
my $html = '<img width="25" height="13" border="0" src="/images/flags/de.png">';

my $w = Web::Query->new_from_html($html);
$w->find('img[src]')->each(sub {
    my (undef, $i) = @_;
    $i->attr('src', URI->new_abs($i->attr('src'), $dest));
});
print $w->html;

答案 1 :(得分:3)

使用适当的解析器,例如HTML::TokeParser::Simple

#!/usr/bin/env perl

use strict; use warnings;
use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new( ... );

while (my $token = $parser->get_token) {
    if ($token->is_start_tag('img')) {
        if (defined(my $src = $token->get_attr('src'))) {
            $token->set_attr(src => "$dest/$src");
        }
    }
    print $token->as_is;
}

答案 2 :(得分:2)

您的尝试无效,因为模式中间的贪婪.*与第一个src=和最后一个"之间的所有相匹配。< / p>

让它变得非贪婪.*?会有所帮助。

答案 3 :(得分:0)

my $dest = 'http://example.com/blah/';
my $html = '<img width="25" height="13" border="0" src="/images/flags/de.png">';
$html =~ s!(?<=src=")(?=/)!$dest!;
print $html;