Bonjour à tous !

Pour me connecter à une page WebDav, j'ai utilisé cURL.
Je voulais ensuite récupérer la source xml, mais il s'avère que c'est du html.
Alors je me suis rappatrié sur simple_html_dom pour pouvoir ensuite modifier les liens qui sont de cette forme:

<li><a href="fichier/"> nom du fichier/</a></li> 

afin que ceux -ci ressemblent au final à

<li><a href="http/site/dossier/fichier">fichier</a></li>

Seulement, je ne parviens pas utiliser Simple_Html_Dom avec cURL.

Voici ce que j'ai fait:

<?php 
$url = 'http://ADRESSE/Medias/Musique'; 
$timeout = 10; 

$http_auth_ident = 'login:mot de passe'; // username:password 

$ch = curl_init($url); 

curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

if (preg_match('`^http://`i', $url)) 
{ 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
} 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Retourner le contenu téléchargé dans une chaine (au lieu de l'afficher directement)

// Définition de la méthode d'authentification du serveur 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 

// Définition des identifiants 
curl_setopt($ch, CURLOPT_USERPWD, $http_auth_ident); 

$serveur_musique = curl_exec($ch); // Le contenu téléchargé est enregistré dans la variable $serveur_content.

curl_close($ch);

echo $serveur_musique;

// debut parsing html
 require_once CORE.DS.'simple_html_dom.php';
$html = new simple_html_dom();
$html->load_file($serveur_musique);
foreach ($html->find('a') as $href){
echo $href->src.'<br/>';
}

Quand il suffit de se connecter, ça fonctionne bien et je récupère l'"image"de mon serveur,
mais je ne parviens pas à "coupler" la suite pour parser.

Il y aurait-il une bonne âme pour m'aiguiller ?

J'ai toujours des erreur telle que celle-ci:

( ! ) Warning: file_get_contents(&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Index of /Medias/Musique&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h1&gt;Index of /Medias/Musique&lt;/h1&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/Medias/&quot;&gt; Parent Directory&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;ACDC/&quot;&gt; ACDC/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Adele/&quot;&gt; Adele/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Alain%20Bashung/&quot;&gt; Alain Bashung/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Alanis%20Morissette/&quot;&gt; Alanis Morissette/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Alexandre%20Varlet/&quot;&gt; Alexandre Varlet/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Alexis%20HK/&quot;&gt; Alexis HK/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Amy%20MacDonald/&quot;&gt; Amy MacDonald/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;Amy%20Winehouse/&quot;&gt; Amy Winehouse/&lt;/a&gt;&lt;/li& in E:\ site internet\Wamp\wamp\www\monsite \core\simple_html_dom.php on line 1081
Call Stack
#   Time    Memory  Function    Location
1   0.0012  138936  {main}( )   ..\index.php:0
2   0.0080  257632  Dispatcher->__construct( )  ..\index.php:11
3   0.0127  325216  Controller->render( )   ..\Dispatcher.php:26
4   0.0135  348736  require( 'E:\Creation site internet\Wamp\wamp\www\monsite\view\pages\video.php' )   ..\Controller.php:53
5   0.0453  651240  simple_html_dom->load_file( )   ..\video.php:42
6   0.0453  660784  call_user_func_array:{E:\monsite\core\simple_html_dom.php:1081} ( ) ..\simple_html_dom.php:1081
7   0.0453  661000  file_get_contents ( )   ..\simple_html_dom.php:1081

Merci de votre aide

6 réponses


JoHuv
Auteur
Réponse acceptée

Re-bonjour à tous, après 15 jours de galère, j'ai résolu mon pb. Je tournais autour et c'était si simple ! ^^

Je le met ici au cas où ça peut aider quelqu'un d'autre !

Je rappelle que le but était de faire une page sur mon site privé familiale, avec les liens opérationnels, pour que ma famille puisse accéder rapidement et facilement sur mon serveur perso. (nous ne sommes pas tous égaux face à un ordinateur).

Merci encore Kenor, tu n'est pas étranger à cette solution.

<?php 
$url = 'http://*monWebdav*/Medias/Video/';
$timeout = 10; 

$http_auth_ident = '*login*:*pass*'; // Login:mot de passe. 

//je me connecte
$ch = curl_init($url); 

curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

if (preg_match('`^http://`i', $url)) 
{ 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
} 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Retourner le contenu téléchargé dans une chaine (au lieu de l'afficher directement)

// Définition de la méthode d'authentification du serveur 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 

// Définition des identifiants 
curl_setopt($ch, CURLOPT_USERPWD, $http_auth_ident); 

$serveur = curl_exec($ch); // Le contenu téléchargé est enregistré dans la variable $serveur_video.

curl_close($ch);

// je récupère maintenant la connection pour parser le HTML

require_once CORE.DS.'simple_html_dom.php';
$html = new simple_html_dom();
$html->load($serveur);

// je cherche les liens à modifier pour qu'il n'y ai plus qu'à cliquer dessus sur la page du site.

foreach ($html->find('a') as $a){ 
    $href = $a->href;
    $newhref = 'http://*webdav*/Medias/Video/'.$href;                       //je fabrique la nouvelle adresse
    $a->href = $newhref;                                                                            // je change l'adresse du lien
}
$video = $html->save();                                                                             // je sauvegarde.
echo $video;                                                                                                 // je met sur la page du site le résultat.
JoHuv
Auteur

Bon, pour la suite: j'ai réussit à faire fonctionner DOM après cURL.

Par contre, j'ai un autre problème: je ne parviens pas à modifier les mauvais liens:

Voici la page html que j'ai:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>  <head>   <title>Index of /Medias/Video</title>  </head>  <body> <h1>Index of /Medias/Video</h1> <ul><li><a href="/Medias/"> Parent Directory</a></li> <li><a href="Films/"> Films/</a></li> <li><a href="Vid%c3%a9o%20Maman/"> Vidéo Maman/</a></li> <li><a href="Vid%c3%a9o%20Manon%20et%20Zo%c3%a9/"> Vidéo Manon et Zoé/</a></li> <li><a href="Vid%c3%a9o%20Papa/"> Vidéo Papa/</a></li> <li><a href="Vid%c3%a9o%20cam%c3%a9scope/"> Vidéo caméscope/</a></li> </ul> </body></html>

Voici mon code:

require_once CORE.DS.'simple_html_dom.php';
$html = new simple_html_dom();
$html->load($serveur_video);
foreach ($html->find('a') as $a){
    foreach ($a-> find ('href') as $hrefs){  // je cherche les liens 
        $href = 'http://adresse/Medias/Video/'.$hrefs; // je rajoute l'adresse complementaire pour faire un lien complet
        $html->save();
    }
}
echo $html;

Et ce qui s'afficher est, par concéquent, la page souhaitée mais quand je clic sur les liens, ça ne fonctionne évidemment pas (puisque mon code est faut.)

J'ai essayé tellement de truc différents que je ne saurais même pas vous dire tout ce que j'ai fait. Il y aurait-il un super heros pour m'aiguiller ? merci de votre temps.

"je cherche les liens" > mais tu as déjà fais un foreach du "a" juste avant.
Ensuite faire une recherche de lien "find('href')" si c'est comme jquery, ça ne marchera pas (je ne connais pas spécialement simple_html_dom, j'utilise un système maison). Mais il est plus probable que ->attr('href') te retourne le contenu de href (sans avoir besoin d'un foreach).

Ensuite, je ne sais pas ce que tu souhaites faire, mais si ton seul besoin est celui que tu décris, il me parait bien plus simple d'utiliser un regex classique via preg_replace.

JoHuv
Auteur

Merci Kenor,

Oui, un preg replace, j'y ai pensé, mais vu que je suis sur Dom, je voulais faire avec ce que j'ai comme info dessus, et ils n'en parlent pas.

sinon, voici ce que je viens d'essayer.

 require_once CORE.DS.'simple_html_dom.php';
$html = new simple_html_dom();
$html->load($serveur_video);
foreach ($html->find('a') as $a){ // je cherche les liens
    $newhref = 'http://*monWebDav*/Medias/Video/'.$a; //je fabrique la nouvelle adresse
    $a->setAttribute('href',$newhref); // je change l'adresse du lien
}
$video = $html->save();  //je sauvegarde
echo $video;  // je vois ce que j'ai fais

et ceci est ce que ça me donne. Je suis sûr de tourner autour de la solution...
(sur ma page du site php)
Index of /Medias/Video
Parent Directory"> Parent Directory
Films/"> Films/
Vidéo Maman/"> Vidéo Maman/
Vidéo Manon et Zoé/"> Vidéo Manon et Zoé/
Vidéo Papa/"> Vidéo Papa/
Vidéo caméscope/"> Vidéo caméscope/

(sur le code source :)

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html>  <head>   <title>Index of /Medias/Video</title>  </head>  <body> <h1>Index of /Medias/Video</h1> <ul><li><a href="http://*monWebDav*/Medias/Video/<a href="/Medias/"> Parent Directory</a>"> Parent Directory</a></li> <li><a href="http://*monWebDav*/Medias/Video/<a href="Films/"> Films/</a>"> Films/</a></li> <li><a href="http://*monWebDav*/Medias/Video/<a href="Vid%c3%a9o%20Maman/"> Vidéo Maman/</a>"> Vidéo Maman/</a></li> <li><a href="http://*monWebDav*/Medias/Video/<a href="Vid%c3%a9o%20Manon%20et%20Zo%c3%a9/"> Vidéo Manon et Zoé/</a>"> Vidéo Manon et Zoé/</a></li> <li><a href="http://*monWebDav*/Medias/Video/<a href="Vid%c3%a9o%20Papa/"> Vidéo Papa/</a>"> Vidéo Papa/</a></li> <li><a href="http://*monWebDav*/Medias/Video/<a href="Vid%c3%a9o%20cam%c3%a9scope/"> Vidéo caméscope/</a>"> Vidéo caméscope/</a></li> </ul> </body></html>

J'ai réussi à insérer l'adresse correctement, sauf que la suite n'est pas bonne^^
exemple:

<li><a href="http://*monWebDav*/Medias/Video/<a href="Vid%c3%a9o%20cam%c3%a9scope/"> Vidéo caméscope/</a>"> Vidéo caméscope/</a></li>

doit devenir

<li><a href="http://*monWebDav*/Medias/Video/Vid%c3%a9o%20cam%c3%a9scope/"> Vidéo caméscope/</a></li>

Si il s'agit de http://simplehtmldom.sourceforge.net/
ils donnent en exemple

foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

donc à la place de ton $a, essai $a->href

JoHuv
Auteur

J'editais mon message pendant que tu y mettais le tien ^^

Pour le $a->href, c'est l'echo. Mon pb est vraiment la façon de modifier l'adresse... je dois m'y prendre comme un manche ! Au cas où tu ne l'avais pas remarqué, je suis encore un bleu en PHP :D