[reglé] Contenu entre 2 balises - PHP

WRInaute passionné
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";
 
WRInaute discret
: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
 
WRInaute impliqué
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.
 
WRInaute passionné
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...
 
WRInaute impliqué
jeroen a dit:
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.
 
WRInaute impliqué
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.
 
WRInaute passionné
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
 
Discussions similaires
Haut