【问题标题】:Php Error in_array() null givenphp 错误 in_array() null 给定
【发布时间】:2015-10-10 08:29:22
【问题描述】:

我遵循了有关制作网络爬虫应用程序的教程。我只是简单地从页面中提取所有链接,然后跟随它们。我在将链接的 foreach 循环推送到全局变量时遇到问题。我不断收到一个错误,提示 in_array 中的第二个变量应该是我设置的数组。有什么你们可能会看到错误的代码吗?

错误:

in_array() expects parameter 2 to be array, null given

HTML:

       <?php

    $to_crawl = "http://thechive.com/";

$c = array();

    function get_links($url){
        global $c;
        $input = file_get_contents($url);
        $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

        preg_match_all("/$regexp/siU", $input, $matches);

        $l = $matches[2];

        $base_url = parse_url($url, PHP_URL_HOST);

        foreach($l as $link){
            if(strpos($link, '#')){
                $link = substr($link, 0, strpos($link, '#'));
            }

            if(substr($link, 0, 1) == "."){
                      $link = substr($link, 1);
            }

            if(substr($link, 0, 7) == "http://"){
                              $link = $link;
                    } elseif(substr($link, 0, 8) == "https://"){
                              $link = $link;
                    } elseif(substr($link, 0, 2) == "//"){
                              $link = substr($link, 2);
                    } elseif(substr($link, 0, 1) == "#"){
                              $link = $url;
                    } elseif(substr($link, 0, 7) == "mailto:"){
                              $link = "[".$link."]";
                    } else{
                        if(substr($link, 0,1) != "/"){
                            $link = $base_url."/".$link;
                        } else{
                            $link = $base_url.$link;
                        }
                    }
            if(substr($link, 0, 7) != "http://" && substr($link, 0, 8) != "https://" && substr($link, 0, 1) != "["){
             if(substr($link, 0 , 8) == "https://"){
                    $link = "https://".$link;
             } else{
                $link= "http://".$link;
             }
            }

        if (!in_array($link, $c)){
            array_push($c, $link);
            }


        }
    }

    get_links($to_crawl);

    foreach($c as $page){
        get_links($page);
    }

    foreach($c as $page){
        echo $page."<br/ >";
    }

    ?>

【问题讨论】:

    标签: php html web-crawler


    【解决方案1】:

    试图在每次迭代中使您的 $c 为“全局”是一个糟糕的设计。您应该尽可能避免“全局”。

    这里我看到 2 个选择:

    1/ 在“get_links”函数的参数中传递您的数组作为参考(搜索谷歌)。它将允许您从函数中填充数组。

    示例:

    function getlinks($url, &$links){
        //do your stuff to find the links
        //then add each link to the array
        $links[] = $oneLink;
    }
    
    $allLinks = array();
    getlinks("thefirsturl.com", $allLinks);
    //call getlinks as many as you want 
    //then your array will contain all the links
    print_r($allLinks);
    

    或者 2/ 让“get_links”返回一个链接数组,并将其连接成一个更大的数组来存储所有链接。

    function getlinks($url){
        $links = array(); 
        //do your stuff to find the links
        //then add each link to the array
        $links[] = $oneLink;
        return $links;
    }
    
    $allLinks = array();
    $allLinks += getlinks("thefirsturl.com");
    //call getlinks as many as you want. Note the concatenation operator +=
    print_r($allLinks);
    

    【讨论】:

    • 感谢您的回复!我有点理解你在说什么,但会更好地看到你的意思的例子。你能做视觉吗?
    猜你喜欢
    • 2016-03-23
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多