Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/03/2007, 15h43   #1
Invité de passage
 
Inscription : mars 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 4
Points : 0
Points : 0
Par défaut Extraction de texte situé entre deux balises

Bonjour,

Je cherche une exp reguliere qui permet d'extraire tous ceux qui se trouvent entre deux balises:

$chaine= "[toto]batati;batata;batutu[/toto]"

Je voudrais d'extaire la chaine "batati;batata;batutu"

merci de votre aide
morpho365 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 15h52   #2
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 306
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 306
Points : 8 590
Points : 8 590
Code :
ereg_replace("\[toto\](.*)\[/toto\]", "\\1", $chaine);
Faut bien tester tous les cas possibles, surtout si tu as des balises imbriquées.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 16h10   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
1. Il vaut mieux utiliser les fonctions de l'extension PCRE (preg_*) plutôt que les POSIX (ereg_*) car les fonctions PCRE sont plus performantes, plus souples et les POSIX seront amenés à disparaître assez rapidement (Yogui disait qu'elles étaient désactivées par défaut depuis la version 5.2).
2. Vous aurez besoin de rendre l'expression non gourmande pour éviter que deux balises toto qui se suivent ne soient considérées comme une seule.
En bref :
Code :
1
2
$chaine= "[toto]batati;batata;batutu[/toto]"
$chaine = preg_replace("#\[toto\](.*)\[/toto\]#U", '\1', $chaine);
Le drapeau s sera nécessaire si le texte comporte des sauts de ligne.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 18h45   #4
Invité de passage
 
Inscription : mars 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 4
Points : 0
Points : 0
Merci Marc et julp,

Voila mon probleme:
Code :
1
2
3
4
5
6
7
$patterns = "#\[toto\](.*)\[/toto\]#U";
$chaine= "azerty [toto] batati ; batata; batutu [/toto] bbbbbb";
$chaine5 = preg_replace($patterns,'\1' , $chaine);
echo "ch5: $chaine5<br>";
 
$chaine6 = preg_replace("#\[toto\](.*)\[/toto\]#U","okdac='\1' et encore" , $chaine);
echo "ch6: $chaine6";
Je voudrait recuperer tout ce qui est entre [toto] ... [/toto] et les mettre apres okdac=......

mais on voir que $chaine5 est ok, mais pas $chaine6 car apres okdac='' vide !!! c'est bizzare !!
morpho365 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 18h59   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est visiblement dû à l'interprétation des "variables" de captures suivant le délimiteur de la chaîne :
Code :
$chaine6 = preg_replace("#\[toto\](.*)\[/toto\]#U","okdac='$1' et encore" , $chaine);
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2007, 12h20   #6
Invité de passage
 
Inscription : mars 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 4
Points : 0
Points : 0
Bonjour Julp,
C'est effectivement ca vient des variables, j'ai deja utiliser les variable $1,$2,$3 dans les autre exp rationnel, comment imposer dans cette expression pour qu'il utililise la var $4 ?
morpho365 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2007, 14h23   #7
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 306
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 306
Points : 8 590
Points : 8 590
Euh... C'est $1, $2, etc., ça fait référence aux tokens isolés dans ton expression régulière par des parenthèses non échappées. Par exemple, dans l'expression "#\[toto\](.*)\[/toto\]#U", y a un seul bloc entre parenthèses non échappée (.*, à savoir tout ce qui se trouve entre [toto] et [/toto]). Donc pour faire référence à ce bloc dans la chaîne de substitution, il faut utiliser $1. Admettons que tu veuilles également identifier et récupérer les balises pour les inversées dans la sortie, tu construirais ton expression régulière ainsi : "#(\[toto\])(.*)(\[/toto\])#U" et tu utiliserais $1 pour faire référence à [toto] (premier groupe de parenthèses), $2 pour faire référence à ce qui se trouve entre les 2 balises (second groupe de parenthèses) et $3 pour faire référence à [/toto] (3ème groupe de parenthèses). $1, $2, c'est pas une référence à d'éventuelles variables utilisées dans d'autres expressions régulières.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2007, 18h18   #8
Invité de passage
 
Inscription : mars 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 4
Points : 0
Points : 0
Merci Marc,
En fait mon probleme est presque resolu.
on a à extraire la chaine entre ces 2 balises
[toto]batata;batiti;batutu[/toto]

L'exp rationnel cidessus marche bien , on recupere bien la chaine:

okdac="batata;batiti;batutu"

Dans mon truc on oblige l'utilisateur entrer les donnees en une seule ligne

je voudrais trouver une exp rationnel pour un entrer

[toto]
batata ;
batiti ;
batutu
[/toto]

et recuperer

okdac="batata ; batiti ; batutu"
morpho365 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h01.


 
 
 
 
Partenaires

Hébergement Web