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

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

Marsh Posté le 09-08-2005 à 21:29:49    

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".
Reply

Marsh Posté le 09-08-2005 à 21:29:49   

Reply

Marsh Posté le 09-08-2005 à 21:59:56    

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 !
Reply

Marsh Posté le 10-08-2005 à 09:11:10    

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

Reply

Marsh Posté le 10-08-2005 à 09:28:43    

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 !
Reply

Marsh Posté le 10-08-2005 à 10:01:56    

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

Reply

Marsh Posté le 10-08-2005 à 10:32:22    

Reply

Marsh Posté le 10-08-2005 à 16:19:19    

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

Reply

Marsh Posté le 11-08-2005 à 00:14:51    

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".
Reply

Marsh Posté le 11-08-2005 à 20:51:41    

:bounce:


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 11-08-2005 à 21:17:55    

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

Reply

Marsh Posté le 11-08-2005 à 21:17:55   

Reply

Marsh Posté le 11-08-2005 à 22:12:15    

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:

Reply

Marsh Posté le 11-08-2005 à 23:59:06    

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

Reply

Marsh Posté le 12-08-2005 à 00:43:07    

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
Reply

Marsh Posté le 12-08-2005 à 01:04:45    

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.

Reply

Marsh Posté le 12-08-2005 à 01:14:54    

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

Reply

Marsh Posté le 12-08-2005 à 07:01:14    

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
Reply

Marsh Posté le 12-08-2005 à 07:11:49    

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
Reply

Marsh Posté le 28-08-2005 à 15:30:09    

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
Reply

Marsh Posté le 28-08-2005 à 16:45:08    

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
Reply

Marsh Posté le 28-08-2005 à 16:48:06    

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
Reply

Marsh Posté le 28-08-2005 à 16:54:56    

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
Reply

Marsh Posté le 28-08-2005 à 19:51:51    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed