[RESOLU] Fonction récursive : Help

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Fonction récursive : Help

Re: Fonction récursive : Help

par Patriboom » 08 janv. 2016, 00:57

Félicitations.

Indique [Résolu] dans ton titre.

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 22:25

Et voilà c'est parfait !

Code : Tout sélectionner

function crawl($url, $limite=0, $lvl=0) { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) { $ecurls[] = $href; $urls[] = array('lvl' => "$lvl", 'parent' => $url, 'url' => $href); } } for($i = 0; $i < count($ecurls); $i++) { if( $limite > 0 ) { $crawl = crawl($ecurls[$i], ($limite - 1), ($lvl + 1)); $urls = array_merge($urls, $crawl); } } $limite = ($limite - 1); return $urls; }
Fonctionne parfaitement, enfin !
Merci de ton aide en tout cas. :) =D>

Re: Fonction récursive : Help

par Patriboom » 07 janv. 2016, 21:55

Intéressant!
Fais les tests et reviens-nous .

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 21:07

Je crois que j'ai réussi (plus ou moins) :

Code : Tout sélectionner

function crawl($url, $limite) { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) { $ecurls[] = $href; $urls[] = $href; } } for($i = 0; $i < count($ecurls); $i++) { //echo $i . ' - ' . $urls[$i] . '<br>'; if( $limite > 0 ) { $urls[] = crawl($ecurls[$i], ($limite - 1)); } } $limite = ($limite - 1); return $urls; }

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 20:51

Merci pour le temps que tu m'accorde, voici le résultat :

Code : Tout sélectionner

Array ( [0] => Array ( [niv] => [adrs] => tel:0123456789 [orig] => ) [1] => Array ( [niv] => [adrs] => http://www.jscourses.com [orig] => ) [2] => Array ( [niv] => [adrs] => http://www.jscourses.com/ [orig] => ) [3] => Array ( [niv] => [adrs] => http://www.jscourses.com/services [orig] => ) [4] => Array ( [niv] => [adrs] => http://www.jscourses.com/tarifs [orig] => ) [5] => Array ( [niv] => [adrs] => http://www.jscourses.com/reserver [orig] => ) [6] => Array ( [niv] => [adrs] => # [orig] => ) [7] => Array ( [niv] => [adrs] => # [orig] => ) [8] => Array ( [niv] => [adrs] => http://www.jscourses.com/reserver [orig] => ) [9] => Array ( [niv] => [adrs] => http://www.jscourses.com/gare-de-lyon [orig] => ) [10] => Array ( [niv] => [adrs] => http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon [orig] => ) [11] => Array ( [niv] => [adrs] => [orig] => ) [12] => Array ( [niv] => [adrs] => http://www.foxinteractive.fr [orig] => ) )
Tout est bien rangé, mais le script ne va pas en profondeur, il scanne que la première page (niveau 0), et ne prend pas en compte le niveau de profondeur demandé.

Re: Fonction récursive : Help

par Patriboom » 07 janv. 2016, 19:04

À ces conditions, tu peux te permettre de redéfinir complètement ta fonction in_multi_array ou à détruire
Je crois - parce qu'un tableau créé par PHP est obligatoirement de taille finie - que tu n'auras pas de problème de cycle infini avec tes fonctions actuelles (sauf in_multi_array qui sera à réécrire ou détruire)

Tandis que tu y es, tu pourrais te mettre des indices faciles à travailler, ça produirait un tableau comme

Code : Tout sélectionner

Array ( [0] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com', 'orig' => '') [1] => array('niv' => 1, 'adrs' => 'http://www.jscourses.com', 'orig' => 'http://www.jscourses.com/') [2] => array('niv' => 1, 'adrs' => 'http://www.jscourses.com', 'orig' => 'http://www.jscourses.com/services') [3] => array('niv' => 2, 'adrs' => 'http://www.jscourses.com/services', 'orig' => 'http://www.jscourses.com/tarifs') [4] => array('niv' => 2, 'adrs' => 'http://www.jscourses.com/services', 'orig' => 'http://www.jscourses.com/reserver') [5] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com/gare-de-lyon'. 'orig' => '') [6] => array('niv' => 0, 'adrs' => 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon','orig' => '')
Voyons voir si ça marche:

Code : Tout sélectionner

function crawl($url, &$urls, $limite, $prof=0, $orig='') //un changement apporté ici { $code_brute = crawlcurl($url); $doc = new DOMDocument(); $doc->loadHTML($code_brute); $balise_a = $doc->getElementsByTagName('a'); foreach($balise_a as $balise) { $href = $balise->getAttribute('href'); // if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') ) // Nouveau centre de traitement if (is_array($href)) { foreach ($href as $ind => $val ) { crawl($val, $urls, $limite, ($prof+1), $orig); } } else { $urls[] = array('niv' => $niv, 'adrs' =>$href, 'orig' =>$orig); } } return $urls; }

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 17:00

C'est une bonne idée, mais j'ai besoin de savoir à quel lien appartiennent tels liens.

Peut-être :

Code : Tout sélectionner

Array ( [0] => array(0, 'http://www.jscourses.com') [1] => array(1, 'http://www.jscourses.com', 'http://www.jscourses.com/') [2] => array(1, 'http://www.jscourses.com', 'http://www.jscourses.com/services') [3] => array(2, 'http://www.jscourses.com/services', 'http://www.jscourses.com/tarifs') [4] => array(2, 'http://www.jscourses.com/services', 'http://www.jscourses.com/reserver') [5] => array(0, 'http://www.jscourses.com/gare-de-lyon') [6] => array(0, 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon')
Mais par contre, la fonction in_multi_array ne modifie pas mon tableau, elle vérifie uniquement si l'url en cours est déjà dans mon tableau ou pas (mais ça ne fonctionne pas je crois, surement à cause de ma structure du tableau actuel...).

Re: Fonction récursive : Help

par Patriboom » 07 janv. 2016, 16:29

Une chose de vérifiée: https://formatrice.wordpress.com/2008/0 ... parcourir/
On ne peut faire autrement, pour connaître tout le tableau et ses dimensions (inégales ici), que de le parcourir récursivement.

As-tu vérifié si ta fonction in_multi_array est appelée ?

Et si ton tableau d'URL était structuré ainsi,

Code : Tout sélectionner

function in_multi_array($value, $array, $prof=0) { foreach ($array as $key => $item) { if (!is_array($item)) { if ($item == $value) return true; } else { if (in_array($value, $item)) return true; else if (in_multi_array($value, $item, ($prof+1))) return true; } } return false; }

Tu pourrais alors avoir un tableau beaucoup plus facile à gérer s'il était ainsi

Code : Tout sélectionner

Array ( [0] => array(0, 'http://www.jscourses.com') [1] => array(1, 'http://www.jscourses.com/') [2] => array(1, 'http://www.jscourses.com/services') [3] => array(2, 'http://www.jscourses.com/tarifs') [4] => array(2, 'http://www.jscourses.com/reserver') [5] => array(0, 'http://www.jscourses.com/gare-de-lyon') [6] => array(0, 'http://www.jscourses.com/gare-de-lyon/taxi-moto-gare-de-lyon')
où la première valeur serait la profondeur. T'aurais alors un tableau presque plat, conservant l'information essentielle.

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 12:23

J'ai essayé, ça me donne rien d'intéressant, que ce que j'ai déjà.

Re: Fonction récursive : Help

par Patriboom » 07 janv. 2016, 09:54

Tiens, je pensais à cela, afin de « nettoyer » un peu tes résultats, peut-être pourrais-tu simplement faire un array_flip. Tes urls seraient automatiquement réduits à une occurrence et la valeur te fournirait la profondeur de la-dite adresse.

Re: Fonction récursive : Help

par Patriboom » 07 janv. 2016, 01:14

bref, as-tu vérifié si ta routine passe par ta fonction in_multi_array ? Insères-y des echo, des marqueurs qui te permettent de vérifier si la sous-routine est appelée.

Si elle n'est pas appelée, insère des echo affichant les variables qui sont vérifiées par ton if (!in_multi_array)
comme ceci:

Code : Tout sélectionner

$href = $balise->getAttribute('href'); echo 'Voici href = '.$href.'<br />'; echo 'Voici urls = '.$urls).'<br />'; echo 'Voici racine(url) = '.racine($url)).'<br />'; echo 'Voici est-ce un pdf = '. ((strstr($href, 'pdf') ) ? 'oui' : 'non').'<br />'; if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') )

Re: Fonction récursive : Help

par CoeurBis » 07 janv. 2016, 00:28

Non, car je recherche bien si la racine du site ext présent dans l'URL en question, par exemple :

Code : Tout sélectionner

strstr('http://www.monsite.com/mapage.html', 'monsite.com');

Re: Fonction récursive : Help

par Patriboom » 06 janv. 2016, 23:13

N'empêche, ton test ne devrait-il pas être plutôt ainsi :

Code : Tout sélectionner

strstr(racine($url), $href)

Re: Fonction récursive : Help

par CoeurBis » 06 janv. 2016, 22:19

En fait, je fais des tests sur des sites qui ont des URLs absolues, donc avec la racine complète.

Si ça marche, ensuite je pense prendre ceux sans la racine (relatifs) et ajouter le préfix afin de les crawler... Donc le problème ne vient pas de là à mon avis.

Re: Fonction récursive : Help

par Patriboom » 06 janv. 2016, 22:16

Si ta fonction in_multi_array n'est pas appelée, il faut que tu te questionne sur la façon de l'appeler.
Quant moi, j'ai des doutes relativement à

Code : Tout sélectionner

strstr($href, racine($url))
dans

Code : Tout sélectionner

if( !in_multi_array($href, $urls) && strstr($href, racine($url)) && !strstr($href, 'pdf') )
Est-ce qu'une URL complète peut être dans sa racine?
La logique ne nous demanderait-elle pas l'inverse (que la racine se trouve dans l'URL complète ) ?