2010-12-22 72 views
1

我正在創建一個類來打開網頁並存儲頁面上所有出站鏈接的href值。由於某種原因,它適用於前3然後變得更加奇怪。以下是我的代碼:strpos問題:獲得價值UBLIC返回

class Crawler { 
var $url; 

function construct($url) { 
    $this->url = 'http://'.$url; 
    $this->crawl(); 
} 

function crawl() { 
    $str = file_get_contents($this->url); 
    $start = 0; 
    for($i=0; $i<10; $i++) { 
     $beg = strpos($str, '<a href="http://',$start)+16; 
     $end = strpos($str,'"',$beg); 
     $diff = $end - $beg; 
     $links[$i] = substr($str,$beg, $diff); 
     $start = $start + $beg; 
    } 
    print_r($links); 
} 
} 

$crawler = new Crawler; 
$crawler->construct('www.yahoo.com'); 

忽略for循環暫時我知道這隻會返回前10個,不會執行整個文檔。但是如果你運行這個代碼,前3個工作正常,但其他所有值都是UBLIC。 任何人都可以幫忙嗎?由於

回答

2

相反的:

$start = $start + $beg; 

嘗試:

$start = $beg; 

這很可能爲什麼你只看到了前三次比賽。

此外,您還需要插入檢查$begFALSE

for($i=0; $i<10; $i++) { 
    $beg = strpos($str, '<a href="http://',$start)+16; 
    if ($beg === FALSE) 
     break; 
    //... 

但是請注意,你真的應該使用DOMDocument找到一個給定標記名稱的文檔中的所有標籤(a這裏)。特別是,因爲這是可能不是有效的XHTML的HTML,所以應該考慮使用loadHTML方法。

1

我覺得你有你的邏輯存在問題:

您使用$開始,以紀念從哪裏開始尋找在href的地方,但由此產生的$beg仍將是一個索引完整的字符串。所以當你通過加入$beg更新$start時,你會得到很高的價值。您應該嘗試$start = $beg + 1而不是$start = $start + $beg