2011-10-23 84 views
0

我正在構建一個依賴於書籤的網站。這些書籤包含URL和其他一些元素。不過,我需要從用戶書籤的頁面中選擇1張圖片。目前我正在嘗試使用PHP簡單HTML DOM解析器http://simplehtmldom.sourceforge.net/解析外部HTML並返回圖像

它按預期方式拉取HTML,並按預期返回標記。但是,我想更進一步,只返回最小寬度爲40px的圖像。我知道函數getimagesize(),但從我的理解,這是資源沉重。是否有更好的方法可用於預處理圖像並獲得我期待的結果?

謝謝!

+0

顯然,'getimagesize'必須下載圖像,如果它們是遠程的。除此之外,我不知道任何性能問題。你從哪裏讀到的? –

+0

您可以首先檢查img標籤是否設置了寬度,並在使用getimagesize之前使用該寬度。此外,標題信息包含大小..你可以忽略任何大於特定大小的圖像。即使你不知道尺寸,你可以假設一個100kb的圖像不是40x800 –

+0

@matthew,下載所有的圖像是性能問題。如果我不需要,我不想浪費帶寬。 –

回答

0

首先檢查圖片HTML標籤是否有寬度屬性。如果它在40以上,請跳過它。正如馬修提到的那樣,在人們將大圖像縮小到40px寬度時,會出現誤報,但這沒什麼大不了的;這一步驟的關鍵是快速清除顯然過大的前十幾個圖像。

一旦腳本捕獲到一個圖像,說明它的寬度小於40px,請檢查標題信息以根據文件的大小推斷出一個寬度。這比getimagesize快,因爲你不必下載圖像來獲取信息。

function get_image_kb($path) { 
    $headers = get_headers($path); 
    $len = explode(" ",$headers[6]); 
    return $len[1]; 
} 


$imageKb = get_image_kb('test1.jpg'); 
// I'm going to gander 40x80 is about 2000kb 
$cutoffSize = 2000; 
if ($imageKb < $cutoffSize) { 
    // this is the one! 
} 
else { 
    // it was a phoney, keep scraping 
} 

將它設置爲2000kb也會讓圖像100x30,這是不好的。

但是,在這一點上,你已經淘汰了大部分800kb的文件,這會讓你放慢速度,並且因爲我們知道它在2kb以下,所以用getimagesize()來測試這個文件並不算太重。準確的寬度。

您可以根據40px標記的挑剔程度來調整過程,因爲通常情況下,更高的精確度需要更多時間,反之亦然。

+0

謝謝!這有助於加快速度。現在我只需要弄清楚如何加快PHP簡單的HTML DOM解析器:) –

+0

根據你需要刮的東西,也許正則表達式比解析DOM –