1

私は本当に奇妙な問題を抱えています:私はhtmlサイトでURLを検索していて、URLの特定の部分だけが欲しいのです。私のテストHTMLページでは、リンクは1回だけ発生しますが、1つの結果ではなく、約20を取得します...

これは私の正規表現imを使用しています:

perl -ne 'm/http\:\/\myurl\.com\/somefile\.php.+\/afolder\/(.*)\.(rar|zip|tar|gz)/; print "$1.$2\n";'

サンプル入力は次のようになります。

<html><body><a href="http://myurl.com/somefile.php&x=foo?y=bla?z=sdf?path=/foo/bar/afolder/testfile.zip?more=arguments?and=evenmore">Somelinknme</a></body></html>

これは非常に簡単な例です。したがって、実際には、リンクは、周りにコンテンツがある通常のWebサイトに表示されます...

私の結果は次のようになります。

testfile.zip

しかし、代わりに私はこの行を頻繁に見ます...これは正規表現または他の何かの問題ですか?

4

3 に答える 3

5

はい、正規表現は貪欲です。

代わりに HTML 用の適切なツールを使用してください: HTML::LinkExtorまたはWWW::Mechanize のリンク メソッドの 1 つ、次にURIを使用して特定の部分を抽出します。

use 5.010;
use WWW::Mechanize qw();
use URI qw();
use URI::QueryParam qw();

my $w = WWW::Mechanize->new;
$w->get('file:///tmp/so10549258.html');
for my $link ($w->links) {
    my $u = URI->new($link->url);
    # 'http://myurl.com/somefile.php?x=foo&y=bla&z=sdf&path=/foo/bar/afolder/testfile.zip&more=arguments&and=evenmore'
    say $u->query_param('path');
    # '/foo/bar/afolder/testfile.zip'
    $u = URI->new($u->query_param('path'));
    say (($u->path_segments)[-1]);
    # 'testfile.zip'
}
于 2012-05-11T10:03:51.603 に答える
1

リンクの後にファイルの次の20行がありますか?

問題は、一致する変数がリセットされないことです。あなたは最初にあなたのリンクと一致し、それらの値$1$2取得します。次の行では、正規表現は一致していませんが$1$2古い値が残っているため、毎回ではなく、正規表現が一致する場合にのみ印刷する必要があります。

perlreから、「キャプチャグループ」のセクションを参照してください。

注:Perlで一致に失敗しても、一致変数はリセットされません。これにより、一連のより具体的なケースをテストし、最適な一致を記憶するコードを簡単に記述できます。

于 2012-05-11T10:10:53.830 に答える
-2

これは、サンプルの入力と出力のトリックを行う必要があります。

$Str = '<html><body><a href="http://myurl.com/somefile.php&x=foo?y=bla?z=sdf?path=/foo/bar/afolder/testfile.zip?more=arguments?and=evenmore">Somelinknme</a></body></html>';

@Matches = ($Str =~ m#path=.+/(\w+\.\w+)#g);
print @Matches ;
于 2012-05-11T10:30:28.280 に答える