2012-05-11 52 views
1

文本我有一個很奇怪的問題:我搜索的網址上的HTML網站,並希望只有網址的特定部分。在我的測試HTML頁面中的鏈接只發生一次,但不是一個結果,我獲得約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> 

這是一個非常簡單的例子。所以在實際的鏈接將衝擊片雷管在一個普通的網站,各地的內容...

我的結果應該是這樣的:

testfile.zip 

,而是我看到這一行很多時候......這是一與正則表達式或與其他東西的問題?

+1

您應該發佈示例輸入和輸出以便更容易理解。 – tuxuday

+0

@tuxuday添加了一些 – reox

+1

由於daxim的回答使用HTML解析器來解析HTML。你仍然可以對它產生的結果使用正則表達式,並且你將避免很多解析痛苦。 –

回答

5

是的,正則表達式是greedy

使用適當的工具代替HTML:HTML::LinkExtorlink 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