2016-06-26 13 views
0

Zuerst als wahrscheinlich werden Sie von meinem Code Ich bin ein noob und versuche, einen Link Crawler, der eine Seite für Links sucht -> dann folgt jeden Link und legt den Link in ein Array. Am Ende sollten wir alle auf dieser Website gefundenen Links haben.für jedes leere mein Array (noob)

Der Code sieht wie folgt aus:

<?php 

$to_crawl = "http://reteteculinare.ro"; 
$c = array(); 
$final = array(); 

function get_Links($to_crawl){ 
    global $c, $final; 
    $input = @file_get_contents($to_crawl); 
    $base_url = parse_url($to_crawl, PHP_URL_HOST); 

    $regexp = '<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>'; 
    preg_match_all("/$regexp/siU", $input, $matches); 

    $l = $matches[2]; 

    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; 

     } else if (substr($link, 0, 8) == "https://"){ 

      $link = $link; 

     } else if (substr($link, 0, 4) == "www."){ 

      $link = substr($link, 4); 

     } else if (substr($link, 0, 6) == "//wwww."){ 

      $link = substr($link, 6); 

     } else if (substr($link, 0, 2) == "//"){ 

      $link = substr($link, 2); 

     } else if (substr($link, 0, 1) == "#"){ 

      $link = $to_crawl; 

     } else if (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, 4) == "www."){ 

       $link = substr($link, 4); 

     } 

     if(substr($link, 0, 7) != "http://" && substr($link, 0, 8) != "https://" && substr($link, 0, 1) != "[") { 

      $link = "http://".$link; 

     } 

     if (!in_array($link, $c)) { 

      array_push($c, $link); 

     } 


    } 

} 

get_links($to_crawl); 

foreach ((array)$c as $page) { 

    get_links($page); 

    foreach ((array)$c as $page) { 

     if (!in_array($page, $final)) { 

      $final[] = $page; 
      echo '<pre>'; 
      print_r($final); 
      echo '</pre>'; 
     } 

    } 

} 

?> 

Das Problem in dem aktuellen Code ist, dass es das Array druckt jedes Mal eine neue Seite hinzugefügt wird, und wir bekommen etwas wie folgt aus:

Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
) 
Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
    [1] => http://reteteculinare.ro/inregistrare/ 
) 
Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
    [1] => http://reteteculinare.ro/inregistrare/ 
    [2] => http://reteteculinare.ro/ 
) 
Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
    [1] => http://reteteculinare.ro/inregistrare/ 
    [2] => http://reteteculinare.ro/ 
    [3] => http://reteteculinare.ro/retete/ 
) 
Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
    [1] => http://reteteculinare.ro/inregistrare/ 
    [2] => http://reteteculinare.ro/ 
    [3] => http://reteteculinare.ro/retete/ 
    [4] => http://reteteculinare.ro/mixer-ingrediente/ 
) 
Array 
(
    [0] => http://reteteculinare.ro/autentificare/ 
    [1] => http://reteteculinare.ro/inregistrare/ 
    [2] => http://reteteculinare.ro/ 
    [3] => http://reteteculinare.ro/retete/ 
    [4] => http://reteteculinare.ro/mixer-ingrediente/ 
    [5] => http://reteteculinare.ro/reteta_saptamanii/ 
) 
... 

Hinweis: - Ich habe versucht, den Ausdruck am Ende der zweiten foreach, ich bekomme immer noch mehr als ein Array. - versucht, den Druck nach der ersten foreach, es gibt nichts aus.

Was mache ich falsch, wie bekomme ich das $ final-Array, nachdem das ganze Skript abgeschlossen ist?

Prost!

+0

drucken es nach 'foreach' vorbei ist. –

+0

Wenn ich es nach der zweiten foreach drucke, bekomme ich immer noch mehr als 1 Array. Wenn ich es nach dem ersten foreach drucke, ist das Array leer. –

Antwort

0

Bewegen Sie print_r($final); außerhalb von foreach

+0

Wenn ich nach dem ersten foreach die Druckfunktion verschiebe, bekomme ich noch mehr Arrays mit den hinzugefügten Seiten. Wenn ich es nach dem zweiten foreach verschiebe, bekomme ich ein leeres Array . –

+0

Also was ist dein Problem.Print deine Ergebnisse nach der ersten foreach – zakhefron

+0

Wurde versucht, nur 1 Array mit allen Links zu erreichen, wenn das Drucken nach dem zweiten Array bekomme ich mehr als 1 Arrays, wenn nach dem ersten bekomme ich nichts. –