0

我想查找和替换(从 html 页面)标签src中所有出现的属性。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

4 回答 4

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;
于 2012-07-03T11:53:48.007 回答
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;
}
于 2012-07-03T11:42:52.077 回答
2

您的尝试没有奏效,因为.*模式中间的贪婪匹配了 first和 last之间的所有内容src="

让它不贪婪.*?会有所帮助。

于 2012-07-03T11:52:04.027 回答
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;
于 2012-07-03T12:34:41.513 回答