【问题标题】:how to search and replace specific src="url" tag in html using perl?如何使用 perl 在 html 中搜索和替换特定的 src="url" 标签?
【发布时间】:2015-12-14 18:22:55
【问题描述】:

假设我有一个变量,其中包含一堆文本,包括普通 HTML 标记中的 URL。特别是,我对标签的 src= 元素感兴趣。假设我知道我想在那一堆文本中搜索的确切 src= 字符串,并且我想用其他一些文本替换它。 . .这是我尝试过的一些方法(伪代码):

my $bunchotxt = << 'END_MESSAGE';
<a href="http://link.com/image.gif"><img class="alignleft size-thumbnail wp-image-295" src="http://link.com/image.gif" alt="shredding" width="150" height="150" /></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis convallis fringilla dui eget cursus. Nullam in mauris viverra elit pharetra fringilla. Pellentesque gravida ligula sit amet magna blandit, semper luctus enim semper. Nam a sem ut ex aliquam consectetur. Nulla enim metus, porta at elementum non, facilisis ullamcorper nisl. Vestibulum sed iaculis ante. Nullam mollis luctus posuere.

Suspendisse ipsum odio, iaculis in malesuada id, varius
END_MESSAGE

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

while ( my $tag = $parser->get_tag('img') ) {
    #print $tag->as_is, "\n";
    for my $attr ( qw( src ) ) {
        $replaceStr = sprintf qq{%s="%s"\n}, $attr, $tag->get_attr($attr);
        $parsedtag =~ s/"//g;
        my @bits = $url->path_segments( );
        $cidreplace{$unparsedtag} = $path;
    }
    my $replaceStr = "src:\"replaced\"";
    $bunchotxt =~ s/$findURL/$replaceStr/g;
    print "$buchotxt\n";
}

【问题讨论】:

  • 那你只需要匹配你要匹配的字符串即可。您忽略了原始来源中的 " 字符。
  • 您在搜索模式中的第一个双引号放错了位置。此外,您不需要转义 =:,但在这种情况下您确实需要转义 .,因为您想匹配文字点。
  • 伙计,我希望我能以真正应该被问到的方式重新发布这个问题。在我试图开始工作的代码中,$findstr 字符填充了另一个循环,该循环使用HTML::Tokeparser::Simple 从原始文本中获取所有 src= 元素的列表。所以 $findstr 最终获得了从代码的 Tokeparser 部分返回的值。我试过用 quotemeta() 来逃避它,但这似乎没有任何区别。希望您愿意在知道这一点后再次参与进来。
  • 好的,我修改了上面的代码,考虑到我刚刚在上面所做的评论。希望有人愿意再试一次。
  • 您的示例中仍然有一堆无关紧要的废话,实际上并没有说明问题!例如,$findURL 来自哪里?这很重要,因为这是问题的症结所在。另外,您说您尝试使用quotemeta,但我在您的代码中没有看到它。请了解如何创建minimal reproducible example

标签: html regex perl


【解决方案1】:

首先,我们需要将您的问题提炼到我们真正关心的部分。您的示例代码不是很好,因为它包含许多不相关的错误,所以我冒昧地删除了我认为解决问题绝对必要的东西。我还在您的 HTML 中添加了一些换行符以帮助水平滚动。

剩下的就是:

use strict;
use warnings;

use HTML::TokeParser::Simple;

my $bunchotxt = << 'END_MESSAGE';
<a href="http://link.com/image.gif">
  <img
      class="alignleft size-thumbnail wp-image-295"
      src="http://link.com/image.gif"
      alt="shredding"
      width="150"
      height="150" />
</a>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis convallis
fringilla dui eget cursus. Nullam in mauris viverra elit pharetra fringilla.
Pellentesque gravida ligula sit amet magna blandit, semper luctus enim semper.
Nam a sem ut ex aliquam consectetur. Nulla enim metus, porta at elementum non,
facilisis ullamcorper nisl. Vestibulum sed iaculis ante. Nullam mollis luctus
posuere.

Suspendisse ipsum odio, iaculis in malesuada id, varius
END_MESSAGE

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

while (my $tag = $parser->get_tag('img')) {
    my $src = $tag->get_attr('src');
    $bunchotxt =~ s/\Qsrc="$src"\E/src:"replaced"/g;
    print "$bunchotxt\n";
}

结果的第一行是:

<a href="http://link.com/image.gif"><img class="alignleft size-thumbnail wp-image-295" src:"replaced" ...

【讨论】:

  • 这是一个很好的解决方案。经过一番研究,我找到了 tokeparser 的 set_attr。这实际上也有效,但我无法看到如何将该更改提交回字符串。这 100% 有效。感谢您对我公认的匆忙示例代码的耐心等待。
  • @2crd3o 那么替换中的src: 是不是应该是src= 的错字?
猜你喜欢
  • 2019-03-03
  • 2015-08-01
  • 1970-01-01
  • 2017-02-24
  • 2017-01-03
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多