我建議讓一個經過很好驗證的模塊(如HTML::LinkExtor)爲您做了繁重的工作,並使用正則表達式來驗證它找到的鏈接。看看下面的例子,它可能會多麼容易。
use Modern::Perl;
use HTML::LinkExtor;
use Data::Dumper;
my @links;
# A callback for LinkExtor. Disqualifies non-conforming links, and pushes
# into @links any conforming links.
sub callback {
my ($tag, %attr) = @_;
return if $tag ne 'a';
return unless $attr{href} =~ m{http(?:s)?://[^/]*torrent}i;
push @links, \%attr;
}
# The work is done here: Read the html file, parse it, and move on.
undef $/;
my $html = <DATA>;
my $p = HTML::LinkExtor->new(\&callback);
$p->parse($html);
print Dumper \@links;
__DATA__
<a href="https://toPB.torrent" title="Download this torrent">The goal</a>
<a href="http://this.is.my.torrent.com" title="testlink">Testing2</a> <a href="http://another.torrent.org" title="bwahaha">Two links on one line</a>
<a href="https://toPBJ.torrent.biz" title="Last test">Final Test</a>
A line of nothingness...
That's all folks.
HTML :: LinkExtor讓你設置一個回調函數。該模塊本身解析您的HTML文檔以查找任何鏈接。您正在尋找'a'鏈接(而不是'img'等)。所以在你的回調函數中,只要有一個'a'鏈接就可以儘快退出。然後測試一個'a'鏈接,看看是否有一個'洪流'的名字,在一個適當的位置。如果這個特定的正則表達式不是你所需要的,你必須要更具體,但我認爲這就是你所追求的。當鏈接被發現時,它們被推送到數據結構中。在我的測試腳本結尾處,我打印出結構,以便您可以看到您擁有的結構。
__DATA__
部分包含一些示例HTML片段以及垃圾文本以驗證它僅查找鏈接。
使用經過良好測試的模塊來解析HTML比構造易碎的正則表達式來完成整個工作要持久得多。許多製作精良的解析解決方案都包含正則表達式,但只是在這裏和那裏做點小小的工作。當你開始依靠正則表達式來進行解析(而不是識別小的積木)時,你會很快耗盡氣體。
玩得開心。
如果您給出了一個輸入示例,說明了轉換它的規則並顯示了所需的輸出,那麼有人可以幫助您在Perl中完成,而無需弄清楚sed代碼正在嘗試和未執行的操作。 – d5e5
'這是一個匹配行的例子,其他可以是任何東西:目標是提取https://toPB.torrent for每個這樣的行。' – ccvn
你是否試圖解析完整的HTML頁面來提取'。洪流'鏈接?在這種情況下,您可能想挖掘[HTML :: TreeBulder](http://search.cpan.org/~jfearn/HTML-Tree-4.2/lib/HTML/TreeBuilder.pm)。 – ssapkota