好吧,我正在为一个客户工作,他刚刚将他的语言选择改为Perl。我不是Perl中最好的,但我之前用它做过这样的事情。不久之前。
有很多像这样的链接:
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" class="bnone">Death Becomes Her
(1992)</a>
我想匹配路径“/ en / subtitles / 3586224 / death-become-her-en”并将它们放入数组或列表中(不确定哪些更好用于Perl)。我一直在搜索perl文档,以及查看正则表达式教程,并且大多数(如果不是全部)似乎都倾向于使用〜=来匹配内容而不是捕获匹配。
谢谢,
科迪
答案 0 :(得分:10)
使用适当的HTML解析器来解析HTML。请参阅this example附带的HTML::Parser。
或者,请考虑以下简单示例:
#!/usr/bin/perl
use strict; use warnings;
use HTML::TokeParser::Simple;
my $parser = HTML::TokeParser::Simple->new(\*DATA);
my @hrefs;
while ( my $anchor = $parser->get_tag('a') ) {
if ( my $href = $anchor->get_attr('href') ) {
push @hrefs, $href if $href =~ m!/en/subtitles/!;
}
}
print "$_\n" for @hrefs;
__DATA__
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath
Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');"
class="bnone">Death Becomes Her
(1992)</a>
输出:
/en/subtitles/3586224/death-becomes-her-en
答案 1 :(得分:4)
不要使用正则表达式。使用像HTML::TreeBuilder这样的HTML解析器。
my @links;
my $tree = HTML::TreeBuilder->new; # empty tree
$tree->parse_file($file_name);
$tree->elementify;
my @links = map { $_->attr('href') } $tree->look_down( _tag => 'a');
$tree = $tree->delete;
# Do stuff with links array
答案 2 :(得分:0)
您示例中的网址可以与正则表达式匹配,例如
($url) = /href=\"([^\"]+)\"/i
如果HTML在URL周围使用单引号(或没有引号),或者URL中有引号字符,那么这将无法正常工作。因此,您将获得一些答案,告诉您不要使用正则表达式来解析HTML。注意它们,但如果你确信输入表现良好,那就继续。