2010-12-12 64 views
-1

這應該是一個簡單的正則表達式,但我似乎無法弄清楚。Perl正則表達式從HTML中提取URL

有人可以提供一個單線程來接受任意字符串的任意HTML輸入,並填充HTML代碼中所有Facebook URL(匹配http://www.facebook.com)的數組嗎?

我不想使用任何CPAN模塊,並會更喜歡簡單的正則表達式1班輪。

在此先感謝您的幫助!

+1

看看這個答案︰http://stackoverflow.com/questions/30847/regex-to-validate-uris – supercheetah 2010-12-12 23:13:43

+1

**任意** HTML,呃?它必須「在一條線上」,一條線?我希望它不必適合80列!並沒有CPAN模塊。那麼,我**可以**,但我不確定,但你不希望我。你想要一個正確的答案,還是一個只是偶爾工作的人?關於評論或腳本片段中的網址怎麼樣?那些被實體隱藏的東西呢?標籤中間是否有評論? – tchrist 2011-02-26 01:30:08

回答

5

強制性的鏈接解釋why you shouldn't parse HTML using a regular expression

如此說來,試試這個一個快速和骯髒的解決方案:

my $html = '<a href="http://www.facebook.com/">A link!</a>'; 
my @links = $html =~ /<a[^>]*\shref=['"](https?:\/\/www\.facebook\.com[^"']*)["']/gis; 
+0

這就是我一直在尋找,我很欣賞爲什麼不使用正則表達式的解釋。我想要快速又髒的東西,稍後再回來清理。謝謝。 – 2010-12-12 23:54:40

+1

我反對告訴人們如何在原則上這樣做,但+1無論如何使用否定字符類而不是'。*?'(或者更糟,只是'。*')。 – 2010-12-13 11:43:58

0

也許這可以幫助你:

if ($input =~ /(http:\/\/www\.facebook\.com\/\S+)/) { push(@urls, $1); } 
+0

沒有評論正則表達式,爲什麼不諷刺整個html頁面,然後做'@urls = $ html =〜/([regex])/ gm'或者'/ gs',我總是會忘記。儘管如此,你只需一杆就可以完成所有的比賽。 – 2011-02-26 04:57:27

5

HTML::LinkExtor。浪費你的生命能量(也不是我們的)嘗試使用正則表達式來完成這個任務是毫無意義的。

+0

如果我們決定去HTML :: LinkExtor的方向,你可以提供一些示例代碼來說明這可能如何工作。謝謝! – 2010-12-12 23:54:02

+2

請參閱文檔。 – 2010-12-13 01:09:28

+1

爲什麼要試圖幫助這個傢伙,如果你要說的是「看到文檔」 – Literat 2011-02-25 23:35:16

1

拉塞爾C,你有沒有看過Facebook電影的開始,馬克扎克伯格使用Perl自動從大學的facebook裏提取所有照片(然後在線發佈)。我就像「這就是我要做的!我也會用Perl!」 (除了它可能需要幾天才能完成,而不是2分鐘)。無論如何,我會使用該模塊WWW ::機械化提取鏈接(或照片):

use strict; use WWW::Mechanize; open (OUT, ">out.txt"); my $url="http://www.facebook.com"; my $mech=WWW::Mechanize->new(); $mech->get($url); my @a = $mech->links; print OUT "\n", $a[$_]->url for (0..$#a);

但是這不會讓您登錄到你的Facebook頁面,只是會需要你在日誌中屏幕。我會使用HTTP :: Cookies登錄。爲此,請參閱文檔。只是在開玩笑,只是問。哦,上帝,蘋果餡餅正在燃燒!