Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2994 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème pour parser une page web au niveau de fgets().

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème pour parser une page web au niveau de fgets().

n°1173597
Master_Jul
Posté le 09-08-2005 à 21:29:49  profilanswer
 

Hello,
 
J'essaie de parser le topic trombinoscope sur Discussions :
http://forum.hardware.fr/forum2.ph [...] 827&cat=13
 
Quand je visualise la source sous Firefox, pas de problème, toutes les lignes sont séparées.
Le problème est que mon fgets() ne voit qu'une seule ligne au niveau du texte du topic.
 
Code, tout ce qu'il y a de plus banal :

Code :
  1. <?
  2. $fd = fopen("http://forum.hardware.fr/forum2.php?config=hardwarefr.inc&post=33827&cat=13", "r" );
  3. while (!feof ($fd)) {
  4.   $buffer = fgets($fd, 4096);
  5.   echo $buffer."\n.";
  6. }
  7. fclose ($fd);
  8. ?>


 
Donc au niveau du texte du topic, je me retrouve avec des bouts de la taille du buffer, il ne voit pas les caractères de fin de chaîne. J'ai enregistré la page et je l'ai ouverte avec VI. On voit alors des caractères ^M à la fin de certaines lignes.
Ces caractères sont bien à la fin de chaque ligne du texte du topic. VI interprète également ce bloc de texte comme n'étant qu'une ligne.
 
D'après mes recherches, ce caractère serait le carriage return.
http://www.computing.net/unix/wwwboard/forum/2451.html
 
Je ne sais pas comment spécifier à fgets() que c'est le caractère de fin de ligne. J'ai trouvé ce code, qui, je pense, pourrait m'aider :
 
Sometimes the strings you want to read from a file are not separated by an end of line character.  the C style getline() function solves this.  Here is my version:

Code :
  1. <?php
  2. function getline( $fp, $delim )
  3. {
  4.    $result = "";
  5.    while( !feof( $fp ) )
  6.    {
  7.        $tmp = fgetc( $fp );
  8.        if( $tmp == $delim )
  9.            return $result;
  10.        $result .= $tmp;
  11.    }
  12.    return $result;
  13. }
  14. // Example:
  15. $fp = fopen("/path/to/file.ext", 'r');
  16. while( !feof($fp) )
  17. {
  18.    $str = getline($fp, '|');
  19.    // Do something with $str
  20. }
  21. fclose($fp);
  22. ?>


 
Mais que spécifier comme caractère ? \n \r ne vont pas. :/
 
Merci pour votre aide.
 
 :hello:


Message édité par Master_Jul le 09-08-2005 à 21:31:31

---------------
En français, on écrit "connexion", pas "connection".
mood
Publicité
Posté le 09-08-2005 à 21:29:49  profilanswer
 

n°1173610
zapan666
Tout est relatif
Posté le 09-08-2005 à 21:59:56  profilanswer
 

problème de conversion windows <=> Linux ça ;)
 
uhm, \c ça serait pas ce que tu cherche ? - j'suis pas sur -
(un p'tit ereg_replace & zou, fini)


---------------
my flick r - Just Tab it !
n°1173685
Master_Jul
Posté le 10-08-2005 à 09:11:10  profilanswer
 

Mais on peut écrire ça ? :??:
 
$tmp = fgetc( $fp );
if( $tmp == '\c' )

n°1173694
zapan666
Tout est relatif
Posté le 10-08-2005 à 09:28:43  profilanswer
 

bah oui
mais après une petite verif, \c doit pas existe :D
 

Code :
  1. \r Retour chariot (code ASCII 10)
  2. \n Nouvelle ligne (code ASCII 13)
  3. \f Form feed (code ASCII 12)
  4. \t Tabulation (code  ASCII 9)
  5. \b Retour arrière (code  ASCII 8)


---------------
my flick r - Just Tab it !
n°1173713
Master_Jul
Posté le 10-08-2005 à 10:01:56  profilanswer
 

Ca ne marche pas avec '\r' en tout cas. :/

n°1173732
push
/dev/random
Posté le 10-08-2005 à 10:32:22  profilanswer
 
n°1174021
Master_Jul
Posté le 10-08-2005 à 16:19:19  profilanswer
 

Hum, ok, je vais essayer rt et rb ce soir. Merci.

n°1174283
Master_Jul
Posté le 11-08-2005 à 00:14:51  profilanswer
 

J'ai essayé, ça ne change rien en rt ou rb, même résultat : ça coupe à la taille du buffer, pas en fin de ligne, sur le caractères '^M'.


---------------
En français, on écrit "connexion", pas "connection".
n°1174900
Master_Jul
Posté le 11-08-2005 à 20:51:41  profilanswer
 

:bounce:


---------------
En français, on écrit "connexion", pas "connection".
n°1174913
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 11-08-2005 à 21:17:55  profilanswer
 

et \r\n ou \n\r ou je sais pas quoi :D
sinon affiche le codage des caractères pour savoir ce que c'est exactement, t'auras le code ASCII :D

mood
Publicité
Posté le 11-08-2005 à 21:17:55  profilanswer
 

n°1174935
Master_Jul
Posté le 11-08-2005 à 22:12:15  profilanswer
 

Vraiment bizarre ce code ^M. :/
 
J'ai essayé de magouiller à coups de ord() chr() et printf("%c",$string) mais rien n'y fait. Tout simplement parce que mon fgets() ne voit déjà rien. Le texte est collé pour chaque "nouvelle ligne", il ne voit pas de caractère fantôme apparemment.
 
Help :cry:

n°1174968
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 11-08-2005 à 23:59:06  profilanswer
 

question bête : pourquoi t'utilises pas file() ?

n°1174982
push
/dev/random
Posté le 12-08-2005 à 00:43:07  profilanswer
 

bon ton truc m'intrigait un peu alors jme suis mis à chercher et finalement.. comme délimitateur dans ta fonction getline utilise "\n" (double quote..)


Message édité par push le 12-08-2005 à 00:47:29
n°1174986
push
/dev/random
Posté le 12-08-2005 à 01:04:45  profilanswer
 

http://bugs.php.net/bug.php?id=16708
 
Apparement ça été corrigé, moi je testais sur une 4.1.2-7.0.1 et c'était foireux aussi.

n°1174988
push
/dev/random
Posté le 12-08-2005 à 01:14:54  profilanswer
 

Ça m'apprendra à pas encore être passé en Sarge [:w3c compliant]  
Enfin aux moins on sait pq comme ça.

n°1175000
Master_Jul
Posté le 12-08-2005 à 07:01:14  profilanswer
 

joce a écrit :

question bête : pourquoi t'utilises pas file() ?


Je viens d'essayer, le résultat est un peu plus pratique dans la mesure où il n'y a pas de taille de buffer à indiquer et par conséquent, le texte du topic tient... sur une seule ligne. Donc ça ne change rien au problème.
 
 

push a écrit :

http://bugs.php.net/bug.php?id=16708
 
Apparement ça été corrigé, moi je testais sur une 4.1.2-7.0.1 et c'était foireux aussi.


 
J'ai une 4.3.10 (Windows), ça m'étonnerait que la CVS de septembre 2002 soit plus récente. Si ?


Message édité par Master_Jul le 12-08-2005 à 07:06:31
n°1175004
Master_Jul
Posté le 12-08-2005 à 07:11:49  profilanswer
 

Après upload des fichiers sur une Fedora, elle aussi en 4.3.10, ça marche correctement avec fopen()/fgets() et file().
 
Je crois que la conclusion est claire.
 
Merci pour votre aide et vos recherches. :jap:


Message édité par Master_Jul le 12-08-2005 à 07:12:23
n°1186327
Master_Jul
Posté le 28-08-2005 à 15:30:09  profilanswer
 

Bon, en fait ça ne marche pas mieux.
Je n'avais pas refait de tests depuis.
 
Avec file(), tout le texte du topic est contenu dans une ligne.
 
Avec ce code :
 

Code :
  1. <?
  2. $page=file("http://forum.hardware.fr/forum2.php?config=hardwarefr.inc&post=33827&cat=13", "r" );
  3. foreach ($page as $line)
  4.    echo "-> ".$line."\n";
  5. ?>


 

-> <a href="/profilebdd.php?id=469&amp;cat=13&amp;config=hardwarefr.inc" target="_blank"><img src="http://forum-images.hardware.fr/themes_static/images_forum/1/profile.gif" title="Voir son profil" alt="profil" /></a><a href="/hardwarefr/Discussions/citer-33827-3647455-1-1.htm#formulaire"><img src="http://forum-images.hardware.fr/themes_static/images_forum/1/quote.gif" title="Répondre à ce message" alt="answer" /></a></div>
 
-> <div class="spacer">&nbsp;</div>
 
-> </div>
 
-> Le voici le voilou, le trombi HFR. <span style="color:#00b846"><span class="u">Dernière mise à jour : vendredi 26/08 - 13:00</span></span>
 
<br />&nbsp;<br />Voici le site créé par <a href="http://205208.online.fr/hfr/charlest.jpg" target="_blank" class="cLink">CharlesT</a>


 
Mais comment faire pour récupérer ces fichues lignes ? :pt1cable:


Message édité par Master_Jul le 28-08-2005 à 15:31:29
n°1186372
sielfried
Posté le 28-08-2005 à 16:45:08  profilanswer
 

Perso avec file() j'ai une ligne par message (ce qui me paraît assez logique, un message contient des <br /> mais pas véritablement de retours chariot) et une ligne pour tout le reste du html. :spamafote:


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1186376
sielfried
Posté le 28-08-2005 à 16:48:06  profilanswer
 

Quoiqu'en ouvrant la source avec un éditeur de texte y'a l'air d'avoir des retours en effet. [:figti]


Message édité par sielfried le 28-08-2005 à 16:48:13

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1186377
sielfried
Posté le 28-08-2005 à 16:54:56  profilanswer
 

Essaie avec ça :
 

Code :
  1. function getline($fp)
  2. {
  3.    $result = "";
  4.    while( !feof( $fp ) )
  5.    {
  6.        $tmp = fgetc( $fp );
  7.        if( $tmp == "\r" || $tmp == "\n" )
  8.            return $result;
  9.        $result .= $tmp;
  10.    }
  11.    return $result;
  12. }


 
(modifié par rapport au truc que t'as mis dans ton post de base)


Message édité par sielfried le 28-08-2005 à 16:59:08

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1186513
Master_Jul
Posté le 28-08-2005 à 19:51:51  profilanswer
 

Ca marche parfaitement avec ta solution sielfried ! :jap:
 
Merci beaucoup ! Bonne soirée. :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème pour parser une page web au niveau de fgets().

 

Sujets relatifs
Probleme DBGrid Delphi selection celluleProbleme de compilation Visual C++, enfin je crois
probleme communication client serveurProblème de variables
Problème div/overflowProblème de variable PHP dans un script JS
script vbs dans page phppetit probleme
Problème de mise en page css html IE/firefox 
Plus de sujets relatifs à : Problème pour parser une page web au niveau de fgets().


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR