[reglé] Contenu entre 2 balises - PHP

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


rottman
WRInaute passionné
WRInaute passionné
 
Messages: 2121
Inscription: 6 Jan 2004

[reglé] Contenu entre 2 balises - PHP

Message le Ven Juil 08, 2005 12: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";
Dernière édition par rottman le Ven Juil 08, 2005 12:56, édité 1 fois.


magicaxe
WRInaute discret
WRInaute discret
 
Messages: 151
Inscription: 18 Oct 2004

Message le Ven Juil 08, 2005 12: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

shrom
WRInaute impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

Message le Ven Juil 08, 2005 12: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.
Dernière édition par shrom le Ven Juil 08, 2005 12:41, édité 2 fois.

jeroen
WRInaute passionné
WRInaute passionné
 
Messages: 2455
Inscription: 30 Aoû 2002

Message le Ven Juil 08, 2005 12: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...

shrom
WRInaute impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

Message le Ven Juil 08, 2005 12: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.


rottman
WRInaute passionné
WRInaute passionné
 
Messages: 2121
Inscription: 6 Jan 2004

Message le Ven Juil 08, 2005 12:43

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

shrom
WRInaute impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

Message le Ven Juil 08, 2005 12: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.


rottman
WRInaute passionné
WRInaute passionné
 
Messages: 2121
Inscription: 6 Jan 2004

Message le Ven Juil 08, 2005 12:54

Ouf, GRAND MERCI à vous tous.


sim100
WRInaute passionné
WRInaute passionné
 
Messages: 1431
Inscription: 2 Fév 2003

Re: [reglé] Contenu entre 2 balises - PHP

Message le Mar Nov 15, 2011 11: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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Base

  • Calculer le ratio de liens profonds
    Cet outil vous permet de calculer le taux de liens profonds vers un site web. Un lien profond est un lien qui ne pointe pas vers la page d'accueil mais au contraire vers une page interne du site. Les sites dont l'essentiel du référencement vient de leurs inscriptions dans des annuaires ont un taux de liens profonds faible ; à l'inverse, les sites de référence ont souvent un taux de liens profonds plus important, signe que leur contenu a suscité de nombreux liens spontanés.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité