Messages: 2124

Enregistré le: 6 Jan 2004

Message le Ven Juil 08, 2005 13:15

Bonjour,

Je bloque sur un truc pourtant tout simple ! :oops:

J'ai une chaine, plus précisément la source d'une page, et je souhaite extraire le contenu entre les Xième <balise> et </balise>.

Voila ce que j'ai essayé sans succès :

Code: Tout sélectionner
$src = @implode("", file("page.html"));
   
if(eregi("<balise>(.*)</balise>",$src))
   {
      eregi("<balise>(.*)</balise>",$src,$nb);
      echo $nb[X];
   }
   
   else echo "<balise> non trouvée";
Modifié en dernier par rottman le Ven Juil 08, 2005 13:56, modifié 1 fois.
Haut
8 Réponses
Messages: 151

Enregistré le: 18 Oct 2004

Message le Ven Juil 08, 2005 13:25

:D Hello,

Je n'ai pas testé, mais essaie ça:

Code: Tout sélectionner
<?php

   $pos = 0;
   for($i = 0; $i < X && $pos !== false; $i++)
      $pos = strpos($content, "<balise>", $pos);
      
   if ($pos !== false)
   {
      $posend = strpos($content, "</balise>", $pos)   ;
      if ($posend !== false)
      {
         $str = substr ( $content, $pos + strlen("<balise>"), $posend - ($pos+strlen("<balise>")));
         //process $str ...
      }
   }
?>


En détail, tu recherche la Xième position de la balise
Ensuite, tu recherche la première position de la balise fermante à partir de la position de la Xième balise.

Ensuite tu récupère le texte entre deux... :D
Haut
Messages: 865

Enregistré le: 5 Juil 2004

Message le Ven Juil 08, 2005 13:25

Code: Tout sélectionner
$src = file_get_contents("page.html");
   
preg_match_all( "/<balise>(.*)<\/balise>/U", $src, $match );

if ( count( $match[1] ) > $x ) {
  echo 'Balise trouvée: '.$match[1][$x+1];
}
else {
  echo 'Balise non trouvée.';
}


Edité: j'avais oublié le U dans le pattern.
Modifié en dernier par shrom le Ven Juil 08, 2005 13:41, modifié 2 fois.
Haut
Messages: 2470

Enregistré le: 30 Aoû 2002

Message le Ven Juil 08, 2005 13:30

Salut,
Le problème est que les REGEX sont gourmandes.
Avec ton code tu va englober de la première <balise> à la dernière </balise> sur la première occurence de recherche.

Il faut que ton (.*) empèche de prendre </balise>

Généralement le bidouille :
1/ Je remplace <balise> par un caractère spécial gamais utilisé (<¤> par exemple) et </balise> par </¤> (exemple)
2/ je recherche
eregi("<¤>([^¤]*)</¤>",$src,$nb);

Si y'a plus simple, je suis preneur aussi...
Haut
Messages: 865

Enregistré le: 5 Juil 2004

Message le Ven Juil 08, 2005 13:39

jeroen a écrit:Avec ton code tu va englober de la première <balise> à la dernière </balise> sur la première occurence de recherche.


Exact, j'ai édité le code pour ajouter le paramètre U dans le pattern qui permet de ne pas avoir de REGEXP gourmandes.
Haut
Messages: 2124

Enregistré le: 6 Jan 2004

Message le Ven Juil 08, 2005 13:43

:-( ça me fait balise non trouvée
Haut
Messages: 865

Enregistré le: 5 Juil 2004

Message le Ven Juil 08, 2005 13:50

Ouaip, j'avais encore fais une petite erreur, essaie avec ça:
Code: Tout sélectionner
$src = file_get_contents("page.html");
   
preg_match_all( "/<balise>(.*)<\/balise>/U", $src, $match );

if ( count( $match[1] ) >= $x ) {
  echo 'Balise trouvée: '.$match[1][$x-1];
}
else {
  echo 'Balise non trouvée.';
}


Si tu veux la seconde occurence, $x = 2.
Haut
Messages: 2124

Enregistré le: 6 Jan 2004

Message le Ven Juil 08, 2005 13:54

Ouf, GRAND MERCI à vous tous.
Haut
Messages: 1552

Enregistré le: 2 Fév 2003

Message le Mar Nov 15, 2011 12:54

Bonjour

J'ai essayé le code comme ça

Code: Tout sélectionner
preg_match_all( "/<balise>(.*)<\/balise>/U", "<balise>TEST</balise>", $match );

if ( count( $match[1] ) >= $x ) {
  echo 'Balise trouvée: '.$match[1][$x-1];
}
else {
  echo 'Balise non trouvée.';
}


Et ça ne me sort pas TEST, j'ai juste un "Balise trouvée:" et c'est tout.

Je n'arrive pas à le faire marcher :(

Quelqu'un a essayé?

Merci beaucoup
Haut