0

タグ内の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入れたいURLはどこですか。

私の問題は、最初のオカレンスが検出され、後続のオカレンスが検出されないことです。

/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

.*パターンの真ん中にある貪欲さが最初と最後の間のすべてに一致したため、あなたの試みはうまくいきませんでした。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 に答える