2011-06-28 5 views
1

Извините за длинный код, я действительно теряю его.php странная проблема с циклом

Этот код должен получить список URL-адресов через POST, в текстовом поле с разделительными линиями между каждым URL-адресом. Скрипт должен загрузить каждый URL-адрес, пройти через 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"; в среднем цикле и echo "\ t \ t". $ durl. "\ n"; во внутреннем контуре. Это скажет вам, сколько раз циклы на самом деле запущены, и тогда мы можем выяснить, где это происходит. – ben

ответ

0

Вы только назначаете последний элемент цикла, это выглядит. Вам нужно будет объединиться. Что-то вроде $address .= $element->innertext; внутри цикла (обратите внимание. = Вместо =).

Редактировать: если я не ошибаюсь, что он должен делать. Думаю, я мог сосредоточиться на неправильной части кода.

+0

Эта часть на самом деле нормально, мне нужен последний $ element-> innertext, поэтому нет необходимости конкатенации там. проблема в том, что это визуально выглядит так, что я запускаю getDetails() только один раз, так как получаю только один набор результатов. –

+0

Извините, как только я разместил сообщение, я понял, что, вероятно, не читал его правильно. Но я просто попробовал это без завитушек, и казалось, что все в порядке, хотя я не знаю, как это могло вмешаться. –

0

При использовании DOMDocument на HTML вы загрузите его с $dom->loadHTMLFile() или $dom->loadHTML() вы должны также вызвать libxml_use_internal_errors(true) перед рукой, так что он не будет врезаться из-за неправильно отформатированный HTML.

Смежные вопросы