2010-08-03 92 views
2

我正在試驗使用WordPress的自動註冊(即RSS驅動的博客張貼),而所缺少的是一個組件,用RSS的URL鏈接內容自動填充帖子內容(RSS與解決方案無關)。簡單的PHP屏幕抓取功能

使用標準的PHP 5,我怎麼可以創建一個名爲fetchHTML功能([URL])返回那是<body>...</body>標籤之間發現了一個網頁的HTML內容?

請讓我知道是否有任何先決條件「包括」。 謝謝。

+1

會讓網絡更加垃圾? – 2010-08-04 04:26:33

回答

3

假設它永遠是<body>而不是<BODY><body style="width:100%">或任何東西,除了<body></body>,並與你不應該使用正則表達式解析HTML,即使我約而至,這裏亞去了警告:

<?php 

function fetchHTML($url) 
{ 
    $feed = '<body>Lots of stuff in here</body>'; 

    $content = file_get_contents($url); 

    preg_match('/<body>([\s\S]{1,})<\/body>/m', $content, $match); 

    $content = $match[1]; 

    return $content; 


} // fetchHTML 
?> 

如果你echo fetchHTML([some url]);,你會得到body標籤之間的html。

請注意原始警告。

+0

非常簡單 - 很好的答案。我將如何檢查標籤的不同執行方式(如上面強調的那樣)?是否有不區分大小寫的正則表達式開關? – Yaaqov 2010-08-03 19:33:26

+0

有。這只是我(在模式結束前的那個m之前)。但是,例如,http://stackoverflow.com將無法正常工作,因爲開頭體標籤是'' – hookedonwinter 2010-08-03 19:34:18

+0

明白了。感謝指針。 – Yaaqov 2010-08-03 19:41:56

3

我覺得你使用像SimpleDom一類的更好 - >http://sourceforge.net/projects/simplehtmldom/提取數據,你不需要寫這樣複雜的正則表達式

+0

謝謝。不錯的圖書館,使用直觀,它包括jquery樣選擇器。截至2013年年中,它似乎仍然是一個活躍的項目。 – 2013-09-16 01:32:52

5

好,這是一個DOM解析器的代碼示例的要求。

<?php 

function fetchHTML($url) 
    { 

    $content = file_get_contents($url); 

    $html=new DomDocument(); 
    $body=$html->getelementsbytagname('body'); 
    foreach($body as $b){ $content=$b->textContent; break; }//hmm, is there a better way to do that? 
    return $content; 
    } 
+0

從來沒有見過DomDocument()!我必須確認一下。它使我想僅僅使用jQuery的解決方案...'(<?= $ content?>).find('body').html();'heh – hookedonwinter 2010-08-04 05:20:12

+0

@hookedonwinter哈...這將工作,我猜!如果你在瀏覽器中打開它,嗯......這讓我想起,實際上有一種叫做phpquery的http://code.google.com/p/phpquery/,它非常酷! – JAL 2010-08-04 14:44:05

+0

JL現在你已經給了我足夠的時間來學習下一週。謝謝! – hookedonwinter 2010-08-04 14:54:43