【问题标题】:In Perl, how can I replace relative URLs in src attributes of img tags with absolute URLs?在 Perl 中,如何将 img 标签的 src 属性中的相对 URL 替换为绝对 URL?
【发布时间】:2012-07-03 20:07:30
【问题描述】:

我想(从 html 页面)查找并替换 img 标记中所有出现的 src 属性。例如,采取

<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 选项不应该替换所有匹配项吗?

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

【问题讨论】:

标签: perl html-parsing


【解决方案1】:
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;

【讨论】:

    【解决方案2】:

    您希望将 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;
    

    【讨论】:

      【解决方案3】:

      您的尝试没有成功,因为模式中间的贪婪 .* 匹配了第一个 src= 和最后一个 " 之间的所有内容。

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

      【讨论】:

      • 如果 work 的意思是正确替换所有 src 属性,很可能在各种特定情况下它仍然无法执行您想要的操作。
      • 我只在少数 html 页面上使用它,而且它总是以相同的方式编码,所以它可以工作。但是使用解析器更好
      【解决方案4】:

      使用适当的解析器,例如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;
      }
      

      【讨论】:

      • 我向你保证,/g 有效。但是,请参阅 Alan's answer 了解为什么 /g 不会按照您希望的方式处理您的模式。
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2018-07-27
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多