2011-06-28 138 views
1

對不起,長的代碼,我真的失去它。PHP奇怪的循環問題

這段代碼應該通過POST獲得一個url列表,在每個url之間有一個breakline的textarea。該腳本應該下載每個網址,瀏覽html並獲取一些鏈接,然後進入這些鏈接,獲取一些數據並將其回顯。

出於某種原因,視覺它看起來好像我正在getDetails()只有一次,因爲我只得到一個結果集。

我都檢查過多次,如果foreach循環分別需要每個URL和部分工作

任何人都可以發現這個問題?

require_once('simple_html_dom.php'); 

function getDetails($html) { 
    $dom = new simple_html_dom; 
    $dom->load($html); 
    $title = $dom->find('h1', 0)->find('a', 0); 
    foreach($dom->find('span[style="color:#333333"]') as $element) { 
     $address = $element->innertext; 
    } 
    $address = str_replace("<br>"," ",$address); 
    $address = str_replace(","," ",$address); 
    $title->innertext = str_replace(","," ",$title->innertext); 

    if ($address == "") { 
     $exp = explode("<strong><strong>",$html); 
     $exp2 = explode("</strong>",$exp[1]); 
     $address = $exp2[0]; 
    } 

    echo $title->innertext . "," . $address . "<br>"; 
} 

function getHtml($Url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    curl_setopt($ch, CURLOPT_REFERER, "http://www.google.com/"); 
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0"); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    $output = curl_exec($ch); 
    curl_close($ch); 
    return $output; 
} 

function getdd($u) { 
    $html = getHtml($u); 
    $dom = new simple_html_dom; 
    $dom->load($html); 
    foreach($dom->find('a') as $element) { 
     if (strstr($element->href,"display_one.asp")) { 
      $durls[] = $element->href; 
     } 
    } 
    return $durls; 
} 

if (isset($_POST['url'])) { 
    $urls = explode("\n",$_POST['url']); 
    foreach ($urls as $u) { 
     $durls2 = getdd($u); 
     $durls2 = array_unique($durls2); 
     foreach ($durls2 as $durl) { 
      $d = getHtml("http://www.example.co.il/" . $durl); 
      getDetails($d); 
     } 

    } 
} 
+0

你能舉一個例子,看看$ _POST ['url']可能是什麼樣子?我真的不明白你想做什麼。 –

+0

在那裏得到一些調試輸出。 echo count($ urls)。「\ n」;在外部循環處,echo「\ t」.count($ durls2)。「\ n」;在中間循環,並回顯「\ t \ t」。$ durl。「\ n」;在內部循環。這將告訴你循環實際運行了多少次,然後我們可以找出它失敗的位置。 – ben

回答

0

您只分配循環中的最後一個元素,它看起來像。你需要連接。像循環內部的$address .= $element->innertext;(注意。=而不是=)。

編輯:除非我誤認它應該做什麼。我想我可能一直專注於代碼的錯誤部分。

+0

這部分其實沒問題,我需要最後一個$ element-> innertext,所以不需要連接。問題是,它看起來像我只運行一次getDetails(),因爲我只得到一組結果 –

+0

對不起,一旦我發佈,我認爲我可能不正確地讀它正確。但我只是嘗試沒有捲曲的東西,它似乎循環良好,但我不知道它會如何幹擾。 –

0

當您在HTML DOM文檔使用您$dom->loadHTMLFile()$dom->loadHTML()加載它,你也應該調用libxml_use_internal_errors(true)前手,這樣就不會因爲格式不正確的HTML的崩潰。