php奇怪的循环问题

时间:2011-06-28 19:17:01

标签: php loops foreach

对于长代码很抱歉,我真的失去了它。

这段代码应该通过POST获得一个网址列表,在每个网址之间有分隔线的textarea中。脚本应该下载每个url,浏览html并获取一些链接,然后进入这些链接,获取一些数据并将其回显。

出于某种原因,直观地它看起来好像我只运行getDetails()一次,因为我只得到一组结果。

我已多次检查foreach循环是否分别取出每个网址并且该部分正常工作

有人能发现问题吗?

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);
        }

    }
}

2 个答案:

答案 0 :(得分:0)

你只是在循环中指定最后一个元素,它看起来像。你需要连接。类似于循环内的$address .= $element->innertext;(注意。=而不是=)。

编辑:除非我误解了应该做的事情。我想我可能一直专注于代码的错误部分。

答案 1 :(得分:0)

当您在html上使用DOMDocument时,请使用$dom->loadHTMLFile()$dom->loadHTML()加载它,您也应该事先调用libxml_use_internal_errors(true),以免因格式不正确的html而崩溃。