如何使用Perl提取或更改HTML中的链接?

时间:2008-12-12 05:53:16

标签: html regex perl multiple-instances

我有这个输入文字:

<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><table cellspacing="0" cellpadding="0" border="0" align="center" width="603">   <tbody><tr>     <td><table cellspacing="0" cellpadding="0" border="0" width="603">       <tbody><tr>         <td width="314"><img height="61" width="330" src="/Elearning_Platform/dp_templates/dp-template-images/awards-title.jpg" alt="" /></td>         <td width="273"><img height="61" width="273" src="/Elearning_Platform/dp_templates/dp-template-images/awards.jpg" alt="" /></td>       </tr>     </tbody></table></td>   </tr>   <tr>     <td><table cellspacing="0" cellpadding="0" border="0" align="center" width="603">       <tbody><tr>         <td colspan="3"><img height="45" width="603" src="/Elearning_Platform/dp_templates/dp-template-images/top-bar.gif" alt="" /></td>       </tr>       <tr>         <td background="/Elearning_Platform/dp_templates/dp-template-images/left-bar-bg.gif" width="12"><img height="1" width="12" src="/Elearning_Platform/dp_templates/dp-template-images/left-bar-bg.gif" alt="" /></td>         <td width="580"><p>&nbsp;what y all heard?</p><p>i'm shark oysters.</p>             <p>&nbsp;</p>             <p>&nbsp;</p>             <p>&nbsp;</p>             <p>&nbsp;</p>             <p>&nbsp;</p>             <p>&nbsp;</p></td>         <td background="/Elearning_Platform/dp_templates/dp-template-images/right-bar-bg.gif" width="11"><img height="1" width="11" src="/Elearning_Platform/dp_templates/dp-template-images/right-bar-bg.gif" alt="" /></td>       </tr>       <tr>         <td colspan="3"><img height="31" width="603" src="/Elearning_Platform/dp_templates/dp-template-images/bottom-bar.gif" alt="" /></td>       </tr>     </tbody></table></td>   </tr> </tbody></table> <p>&nbsp;</p></body></html>

正如您所看到的,HTML文本块中没有换行符,我需要查找内部的所有图像链接,将它们复制到目录中,并将文本内的行更改为{{1} }。

目前,我使用的Perl代码如下所示:

./images/file_name

这仅足以处理带有换行符的HTML文本。 我以为只循环正则表达式语句, 但是我必须将匹配行更改为其他文本。

你知道是否有优雅的Perl方法吗? 或者也许我太愚蠢了,看不出明显的做法,而且我知道把全局选项不起作用。

感谢。 〜史蒂夫

3 个答案:

答案 0 :(得分:10)

Perl有很好的HTML解析器,学会使用它们并坚持使用它。 HTML很复杂,允许&gt;在属性中,大量使用嵌套等。使用正则表达式解析它,除了非常简单的任务(或机器生成的代码)之外,很容易出现问题。

答案 1 :(得分:4)

我想你想要我的HTML::SimpleLinkExtor模块:

use HTML::SimpleLinkExtor;

my $extor = HTML::SimpleLinkExtor->new;
$extor->parse_file( $file );

my @imgs = $extor->img;

我不确定你究竟想要做什么,但是如果我没有,那肯定听起来就像其中一个HTML解析模块应该做的那样。

答案 2 :(得分:2)

如果您必须避免使用任何其他模块,例如HTML解析器,您可以尝试:

while ($string =~ m/(?:\<\s*(?:img|iframe)[^\>]+src\s*=\s*\"((?:\w|_|\\|-|\/|\.|:)+)\"|background\s*=\s*\"([^\>]+\.jpg)|\<\s*iframe)/g) {
  $old_src = $1;
            my @tmp = split(/\/Elearning/,$old_src);
                    $new_src = "/media/www/vprimary/Elearning".$tmp[-1];
  if($new_src=~/\?rand/){
    // remove rand and push in @iframes
  else
  {
    // push into @images
  }
}

这样,您可以在所有源代码(包括换行符)上应用此正则表达式,并且具有更紧凑的代码(此外,您将考虑属性及其值之间的任何额外空间)