2012-05-11 3 views
1

私は本当に奇妙な問題があります。私はHTMLサイトでURLを検索していて、URLの特定の部分だけを必要としています。Regexが利用可能なテキストの数が多い

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

サンプル入力は、このようなものになるだろう:

私のテストHTMLページ内のリンクは一度しか発生し、代わりつの結果の私は、約20を得る...

これは使用して私の正規表現のイムです非常に簡単な例である

<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> 

です。その本当のリンクは私の結果はこのようなものでなければなりません...周りのコンテンツで、通常のウェブサイトに

をapperます:

testfile.zip 

ではなく、私は非常に多くの場合、この行を参照してください...このAです正規表現やその他の問題の問題?

+1

サンプル入力と出力を分かりやすくするために投稿する必要があります。 – tuxuday

+0

@tuxudayがいくつか追加されました – reox

+1

daximがHTMLパーサーを使用してHTMLを解析すると答えました。あなたはそれが生成する結果に正規表現を使用することができ、多くの解析苦痛から身を守ります。 –

答えて

5

はい、正規表現はgreedyです。

代わりにHTML::LinkExtorまたはlink methods in WWW::Mechanizeのいずれかの適切なツールを使用してから、特定の部分を抽出するために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' 
} 
+0

mhはかなり良いようですが、私の問題は、リンクが生成され多くの引数が追加されているため、ファイル名のパスとファイルの位置が多岐にわたっていることです。 – reox

+0

サンプルデータに合わせて編集します。 – daxim

+0

私の最初の行のブルートフォースではないので、この解決策はかなり良いと思います。 – reox

1

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

問題は、一致する変数がリセットされないということです。初めてのあなたのリンクに一致するのは$1$2です。次の行で正規表現は一致しませんが、$1$2の値はのままです。したがって、正規表現がと一致する場合にのみ印刷するようにしてください。 perlreから

、セクションキャプチャグループ

注参照:Perlでの失敗マッチはマッチ変数をリセットしません、それは簡単に、より具体的な例シリーズのためにテストし、記憶してコードを書くことができますベストマッチ

-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 ; 
+0

評価が下がった場合は、理由を記入してください。あなたが罰せられ、その理由を知らないことは悪いことです! – tuxuday

関連する問題