我想在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
选项是否应该替换所有出现次数?
我确定正则表达式适用于下一次出现,因为如果我再次添加我的代码行,则会替换下一次出现。
答案 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;