[reglé] Contenu entre 2 balises - PHP

Discussion dans 'Administration d'un site Web' créé par rottman, 8 Juillet 2005.

  1. rottman

    rottman WRInaute passionné

    Inscrit:
    6 Janvier 2004
    Messages:
    2 120
    J'aime reçus:
    0
    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:
    $src = @implode("", file("page.html"));
    	
    if(eregi("<balise>(.*)</balise>",$src))
    	{
    		eregi("<balise>(.*)</balise>",$src,$nb);
    		echo $nb[X];
    	}
    	
    	else echo "<balise> non trouvée";
    
     
  2. magicaxe

    magicaxe WRInaute discret

    Inscrit:
    18 Octobre 2004
    Messages:
    151
    J'aime reçus:
    0
    :D Hello,

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

    Code:
    <?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
     
  3. shrom

    shrom WRInaute impliqué

    Inscrit:
    5 Juillet 2004
    Messages:
    864
    J'aime reçus:
    0
    Code:
    $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.
     
  4. jeroen

    jeroen WRInaute passionné

    Inscrit:
    30 Août 2002
    Messages:
    2 458
    J'aime reçus:
    0
    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...
     
  5. shrom

    shrom WRInaute impliqué

    Inscrit:
    5 Juillet 2004
    Messages:
    864
    J'aime reçus:
    0
    Exact, j'ai édité le code pour ajouter le paramètre U dans le pattern qui permet de ne pas avoir de REGEXP gourmandes.
     
  6. rottman

    rottman WRInaute passionné

    Inscrit:
    6 Janvier 2004
    Messages:
    2 120
    J'aime reçus:
    0
    :-( ça me fait balise non trouvée
     
  7. shrom

    shrom WRInaute impliqué

    Inscrit:
    5 Juillet 2004
    Messages:
    864
    J'aime reçus:
    0
    Ouaip, j'avais encore fais une petite erreur, essaie avec ça:
    Code:
    $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.
     
  8. rottman

    rottman WRInaute passionné

    Inscrit:
    6 Janvier 2004
    Messages:
    2 120
    J'aime reçus:
    0
    Ouf, GRAND MERCI à vous tous.
     
  9. sim100

    sim100 WRInaute passionné

    Inscrit:
    2 Février 2003
    Messages:
    1 540
    J'aime reçus:
    0
    Bonjour

    J'ai essayé le code comme ça

    Code:
    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