lire la ligne suivante.

Petit nouveau ! | 8 Messages

01 août 2013, 12:31

Bonjour à tous,
je suis en train de tenter de réaliser un petit script, mais je bloque sur un problème.
- J'ai un fichier "upload.txt' situé dans un répertoire de mon serveur.
- Je cherche une valeur (dans l'exemple, mon pseudo : corneliux) dans ce fichier. NB : la valeur apparait plusieurs fois dans le fichier.
- Je parviens à trouver cette valeur.
- Mais ce que je veux mettre en variable, ce n'est pas cette ligne, mais la ligne suivante, et ça, je ne sais pas faire.

Voici un extrait du fichier upload que je traite :

Code : Tout sélectionner

</groundspeak:long_description> <groundspeak:encoded_hints>entonnoir</groundspeak:encoded_hints> <groundspeak:logs> <groundspeak:log id="329446625"> <groundspeak:date>2013-07-13T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="5118841">adesio</groundspeak:finder> <groundspeak:text encoded="False">2 petits tours d église pour reperer la cache et hop MPLC</groundspeak:text> </groundspeak:log> <groundspeak:log id="328375452"> <groundspeak:date>2013-07-05T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="7600084">lupauwiltho</groundspeak:finder> <groundspeak:text encoded="False">et de 4!!!</groundspeak:text> </groundspeak:log> <groundspeak:log id="326162992"> <groundspeak:date>2013-06-30T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="6269532">paulterguest</groundspeak:finder> <groundspeak:text encoded="False">en route pour l'eglise suivante:) un cache vite trouvé, malgre des voisin un petit peu curieux! merci pour la cache!</groundspeak:text> </groundspeak:log> <groundspeak:log id="323823069"> <groundspeak:date>2013-06-21T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="1794567">Luna49</groundspeak:finder> <groundspeak:text encoded="False">En route vers Laon. Merci pour la cache.</groundspeak:text> </groundspeak:log> <groundspeak:log id="322867297"> <groundspeak:date>2013-06-16T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="5589534">Corneliux</groundspeak:finder> <groundspeak:text encoded="False">Jour de mariage lors du premier passage, je logue tranquillement cette fois ci.</groundspeak:text> </groundspeak:log> </groundspeak:logs> <groundspeak:travelbugs /> </groundspeak:cache> </wpt>
et voici le code que j'ai pour le moment pour récupérer les données dont j'ai besoin :

Code : Tout sélectionner

/*******************************************************************************************/ //Lecture du fichier et extraction du TITRE et des COORDONNES DE LA CACHE $i = 0; $j = 0; /*Ouverture du fichier en lecture seule*/ //$handle = fopen('fichier.gpx', 'r'); $handle = fopen('tmp/upload.txt', 'r+'); /*Si on a réussi à ouvrir le fichier*/ if ($handle){ /*Tant que l'on est pas à la fin du fichier*/ while (!feof($handle)){ /*On lit la ligne courante*/ $buffer = fgets($handle); /*On cherche si c'est la ligne des coordonnées de la cache*/ if (preg_match("#<wpt lat=#i", "'.$buffer.'")){ //echo $buffer; $tab_coord = explode("\"",$buffer); //coord de la cache // echo "Longitude : ".$tab_coord[1]." Lattitude : ".$tab_coord[3]."<br>"; $tablo_lattitude[$j] = $tab_coord[1]; $tablo_longitude[$j] = $tab_coord[3]; $j++; } /*On cherche si c'est la ligne du nom de la cache*/ if (preg_match("#<urlname>#i", "'.$buffer.'")){ eregi("<urlname>(.*)</urlname>",$buffer,$tab_nom); //Nom de la cache // echo "<strong>".htmlentities($tab_nom[1])."</strong><br>"; $tablo_nom[$i] = htmlentities($tab_nom[1]); $i++; } /*On cherche si c'est la ligne du log du pseudo*/ if (preg_match("#>".$_POST['pseudo']."<#i", "'.$buffer.'")){ C'EST ICI QUE JE GADOUILLE ??????????????????????????????????????????? } } /*On ferme le fichier*/ fclose($handle); }
Comme vous pouvez le voir, la ligne ou il y a mon pseudo ne m'intéresse pas, mais je souhaiterais pouvoir récupérer la ligne suivante afin de récupérer tout mes commentaires qui sont entre les balises "<groundspeak:text encoded="False">" et "</groundspeak:log>".

Quelqu'un peut m'aider ? Parce que là, je ne vois vraiment pas comment faire !!!!
Merci d'avance pour vos pistes, conseils..... solutions ! :P

ViPHP
ViPHP | 2577 Messages

01 août 2013, 14:06

Tu devrais regarder du coté de DOMdocument (http://www.php.net/manual/fr/class.domdocument.php).

Petit nouveau ! | 8 Messages

02 août 2013, 16:53

Je ne peux pas répondre ! Dès que je veux valider mon message, j'ai écrit en rouge au dessus du message :
This message was flagged as spam and has been denied.
Je vais essayer de recréer un sujet....

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 août 2013, 12:45

les soucis de réponse c'est parce que tu n'a pas encore assez de message ;) (au pire tu peux éditer ton message parfois c’est mieux).

ton xml avec le namespace ça met un peu le souk, php à pas trop l'air d'aimer :s


pour le principe j'ai virer tous les "groundspeak" afin de tester facilement.
tu option ce que tu veux avec une requête xpath (plus une boucle me suis pas foulé, comme ça tu peux aussi afficher le contenu des logs
<?php
try {
    $xmlfile = 'corneliux.xml';
    if (file_exists($xmlfile)) {
        $xml = simplexml_load_file($xmlfile);
        $xpath = '//logs/log'; // tous les logs
        foreach($xml->xpath($xpath) as $n) {
            if($n->finder == 'Corneliux'){
                xdebug_var_dump($n);
            }
        }
    }
} catch (Exception $e) {
    xdebug_var_dump($e);
}
résultat
object(SimpleXMLElement)[16]
public '@attributes' =>
array (size=1)
'id' => string '319379657' (length=9)
public 'date' => string '2013-06-02T19:00:00Z' (length=20)
public 'type' => string 'Found it' (length=8)
public 'finder' => string 'Corneliux' (length=9)
public 'text' => string 'Mon premier FTF :-), by night évidemment !
Merci Cachcaillou.

This entry was edited by Corneliux on Sunday, 02 June 2013 at 23:18:39 UTC.' (length=179)
(c'est le nœud complet).

et si tu ne veux que l'élément qui t'appartient la requete xpath devient
<?php
$xpath = '//logs/log[finder=\'Corneliux\']';
c'est pas plus complexe ;)

par contre j'ai pas réussi avec le namespace groundspeak (en java ou en php même combat).
si tu maitrise la génération ce serait p'tet plus simple si tu peux virer ça ;)

j'allais oublier : un lien avec la syntaxe xpath : http://www.w3schools.com/xpath/xpath_syntax.asp

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

04 août 2013, 16:48

Alors là, un grand merci =D> C'est exactement ce que je voulais faire !
J'ai regardé en long en large et en travers la doc pour xpath, mais je ne sais pas pourquoi, je n'arrivais jamais à sortir ce que je voulais. Je crois que j'avais mis un "=" au lieu de "==" ... :oops:
Vraiment, merci merci et encore merci, je vais mettre ça en application demain.
Et pour les groundspeak, je virerais tout ça avec un str_ireplace en php, c'est pas un problème.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 août 2013, 21:42

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.
Il en faut peu pour être heureux ......