-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";
}

あなたのコードには「?」がありません 正規表現に貪欲ではないことを伝える文字。

もう 1 つの方法は、それ自体の前に 'Q' ではないすべての文字を一致させることです。

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

編集: 異なる仕様で投稿を編集したため: HTML を解析する必要がある場合は、適切なモジュールを使用することをお勧めします:

正規表現で html を解析または変更しないでください。HTML::Parser のサブクラスの 1 つを参照してください: 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 に答える