Hallo,

Ik heb het volgende:

<?php

$url = $_GET['url'];

    $var = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                    $var, &$matches);
        
    $matches = $matches[1];
    $list = array();

    foreach($matches as $var)
    {    
$url = $var;

    $var = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                    $var, &$matches);
        
    $matches = $matches[1];
    $list = array();

    foreach($matches as $link)
    {    
        print($link."<br>");
    }
    }


// De functie

    function open_url($url,$ref="")
    {

            $hfile = fopen($url,"r");
            if($hfile){
                while(!feof($hfile)){
                    $html.=fgets($hfile,1024);
                }
            }

        return $html;
    }

?> 


Een URL die ik opgeef wordt doorlopen op URL's die op hun beurt ook weer doorlopen worden. Echter zijn er enkele problemen.

Hoe kan ik dubbele URL's voorkomen? Dat als een URL al aan de beurt is geweest hij niet nog een x getoond wordt? Hoe kan ik dat als een link bijv <a href="index.php"></a> is dat er dan gekeken wordt naar de host en die voor de url geplaatst wordt? Het kan met replace maar dan moet er gekeken worden of er geen http://blabla.com voor staat... in plaats van kijken of er iets staat en dat replacen.

Hoe kan ik in het script verwerken dat hij niet van een bepaalde domein mag afwijken dus stel ik maak een array("http://www.site1.nl";, "http://www.site2.nl";) en dan kijken of begin van URL in array voorkomt. Zoja, doorlopen zoniet dan stoppen.

Ga ondertussen zelf aan de slag maar dit waren wat vragen die bij me opkwamen terwijl ik met het script bezig was! Duurde al even voordat ik goed de URL's uit een pagina kon extracten...
Zie nu ook een fout. Het checkt maar een level dieper... hoe kun je dat oneindig door laten gaan? Dus nu heb ik 1 extra foreach... hoe kun je dat automatiseren (dus niet dat ik 100 foreaches invul) dat hij automatisch steeds een level dieper gaat?
leek me een leuk probleem dus ben t is gaan proberen:
<pre>
<?php
$domein = "cc13575-b.groni1.gr.home.nl";
$file = "http://cc13575-b.groni1.gr.home.nl/kcbprojects.php";
function geturls($f){
global $domein;
static $array = array();
static $count = 0;
preg_match_all("/(\"|')((?:http|https):\/\/" . $domein . "(?:(?!\\1).)*)\\1/", file_get_contents($f), $subs, PREG_SET_ORDER);
foreach($subs as $k => $v){
if(!empty($v[2]) && !in_array($v[2], $array)){
$array[] = $v[2];
$count++;
geturls($v[2]);
$count--;
}
}
if($count == 0) return $array;
}
$result = geturls($file);
print_r($result);
?>
</pre>
edit: if(!in_array()) toegevoegd
werkt denk ik zoals je wil
Thanks, ziet er inderdaad goed uit. Vanmiddag even meespelen!
het kan kleiner.. die counter heb je niet per see nodig maar die heb ik er voor mezelf ingezet.. is handig als je ook nog dimensies aan wilt geven

edit: die counter is ook niet nodig voor de return aangezien je $array ook een global kan maken
Ik heb ermee gespeeld en het werkt maar hij loopt te vaak vast.

Hoe kan ik van mijn originele script een functie maken zodat hij continu de volgend url ook doorloopt?

Dus in deze functie:

  function open_url($url,$ref="")
    {

            $hfile = fopen($url,"r");
            if($hfile){
                while(!feof($hfile)){
                    $html.=fgets($hfile,1024);
                }
            }

        return $html;
     
    }


Eigenlijk dit toevoegen:

 $test = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                    $test, &$matches);
        
    $matches = $matches[1];
    $list = array();

    foreach($matches as $var)
    {    

echo $var;
echo '<br />';

$test = open_url($var);


    	    	


    }


Functies schrijven is niet echt mijn sterkste kant... eigenlijk hoef ik altijd scripts maar eenmaal te gebruiken dus dan is een functie overbodig. Nu moet de functie zich zelf eigenlijk steeds herhalen met de preg_match etc..
hoe bedoel je hij loopt vast? bedoel je dan de tijds limiet? dan moet je die omhoog zetten met set_time_limit..
je hebt zowiezo een recursive function nodig dus wat jij hier boven hebt staan gaat niet werken

in je bovenste functie geef je $ref aan maar die gebruik je niet..
en zo zitten der een paar andere dingen in die volgens mij niet echt kloppen..
het is nou eenmaal een script dat wat meer tijd kost maar dat die echt vast loopt lijkt me sterk..

edit: ohja nog is over dat je geen herhalende functie wil gebruiken.. dit heb je nodig als je een oneindig aantal pagina's langs wil gaan, anders moet je toch echt met een limiet werken.

Reageren