Как мога да взема всички вътрешни адреси в уебсайт?

Ticketa

Registered
Опитвам се да взема всички вътрешни линкове в Х сайт (давам пример с туриста) и ако има дублиране искам да ги "махна":

Код:
class DomDocumentParser {

    private $doc;

    public function __construct($url) {

        $options = array(
            'http'=>array('method'=>"GET", 'header'=>"User-Agent: doodleBot/0.1\n")
        );
        $context = stream_context_create($options);

        $this->doc = new DomDocument();
        @$this->doc->loadHTML(file_get_contents($url, false, $context));
    }

    public function getlinks() {
        return $this->doc->getElementsByTagName("a");
    }

}
function followLinks($url) {

    $parser = new DomDocumentParser($url);

    $linkList = $parser->getLinks();

    foreach($linkList as $link) {
        $href = $link->getAttribute("href");
        followLinks("http://web-tourist.net/".$href);
        echo $href . "<br>";
    }

}

$startUrl = "http://web-tourist.net/";
followLinks($startUrl);
 
Преди echo $href, ги слагай в един глобален масив и гледай дали не са обходени вече. При твърде много линкове може да е неефективно, тъй като търсенето е линейно, но пък времето за fetch'ване на ресурса навярно ще е още по-голямо и първото няма да е от значение.
Ако те притеснява глобалната променлива, можеш да я подаваш и като параметър.
Код:
$urls = [];
function followLinks($url) {

    $parser = new DomDocumentParser($url);

    $linkList = $parser->getLinks();

    foreach($linkList as $link) {
        $href = $link->getAttribute("href");
        if(in_array($href, $urls)) continue;
        $urls[] = $href;
        followLinks("http://web-tourist.net/".$href);
        echo $href . "<br>";
    }
}

$startUrl = "http://web-tourist.net/";
followLinks($startUrl);
 
anonimen каза:
Преди echo $href, ги слагай в един глобален масив и гледай дали не са обходени вече. При твърде много линкове може да е неефективно, тъй като търсенето е линейно, но пък времето за fetch'ване на ресурса навярно ще е още по-голямо и първото няма да е от значение.
Ако те притеснява глобалната променлива, можеш да я подаваш и като параметър.
Код:
$urls = [];
function followLinks($url) {

    $parser = new DomDocumentParser($url);

    $linkList = $parser->getLinks();

    foreach($linkList as $link) {
        $href = $link->getAttribute("href");
        if(in_array($href, $urls)) continue;
        $urls[] = $href;
        followLinks("http://web-tourist.net/".$href);
        echo $href . "<br>";
    }
}

$startUrl = "http://web-tourist.net/";
followLinks($startUrl);

Глобалните променливи са винаги притеснителни. Никога не бих използвал глобална променлива във функция. В този пример, задължително променям кода да приема $urls = [] като втори параметър.
 

Back
Горе