-3

可能重复:
如何在 Perl 中从 HTML 中提取 URL 和链接文本?

我正在尝试获取字符串中的子字符串。字符串中可能有多个与该名称匹配的字符串。

<LI>
<A
 HREF="65378161_12011_Q.pdf"> 
65378161_12011_Q.pdf

</A>

从上面的字符串我想得到文件名“65378161_12011_Q.pdf”。

if($line=~ m/((.*)Q\.pdf)/i ){
          my $inside=$2;
           print " file name:$inside \n";
     }

这是我尝试过的,但它没有得到正确的子字符串。有人可以帮忙吗。如果有人能回答我的问题,我真的很感激。

4

3 回答 3

0

使用 HTML 解析器。

use strictures;
use Web::Query qw();
my $w = Web::Query->new_from_html(<<'HTML');
<LI>
<A
HREF="65378161_12011_Q.pdf">
65378161_12011_Q.pdf

</A>
HTML

$w->find('a')->attr('href');
# expression returns '65378161_12011_Q.pdf'
$w->find('a')->text;
# expression returns ' 65378161_12011_Q.pdf '
于 2012-04-23T20:24:35.673 回答
0

请参阅以下脚本:

#!/usr/bin/env perl

use strict;
use warnings;

my $string = "65378161_12011_Q.pdf";


if($string =~ m/((.*)?Q\.pdf)/i ){
    my $inside=$2;
    print " file name:$inside \n";
}

您的代码只是缺少“?” 告诉正则表达式不要贪婪的字符。

另一种方法是匹配自身之前不是“Q”的所有字符:

m/(^[^Q]+)?Q\.pdf/i

编辑:因为您使用不同的规范编辑了您的帖子:如果您需要解析 HTML,我建议使用适当的模块:

不要使用正则表达式解析或修改 html!查看 HTML::Parser 的子类之一:HTML::TokeParser、HTML::TokeParser::Simple、HTML::TreeBuilder(::Xpath)?、HTML::TableExtract 等。如果您的响应开始“那是矫枉过正。我只想要到……”你错了。 http://en.wikipedia.org/wiki/Chomsky_hierarchy以及 为什么不在HTML 上使用正则表达式

(这是关于使用正则表达式从 irc.freenode.org 上的#perl 频道解析 HTML 的提醒)

编辑2:

这是一个完整的工作示例:

#!/usr/bin/env perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_content('
<LI>
<A
 HREF="65378161_12011_Q.pdf"> 
65378161_12011_Q.pdf

</A>
');

$tree->look_down("_tag", "a")->as_text =~ m/(^[^Q]+)Q\.pdf/i && print "$1\n";
于 2012-04-23T19:50:23.033 回答
-1

自从 。将匹配所有内容,只需删除它周围的括号。

#!/usr/bin/perl

my $line = "65378161_12011_Q.pdf";

if ($line =~ m/(.*Q\.pdf)/i )
{
  my $inside = $1;
  print "filename = $inside\n";
}

产生正确的输出。

希望能帮助到你。

曼尼

于 2012-04-23T19:53:56.543 回答