Problème pour parser du contenu en PHP

WRInaute discret
Bonjour à tous,

Je souhaite parser du contenu de type texte via un script PHP qui ne ressort QUE les chaines de caractères comprises entre deux chaines de caractères.
Exemple:

dans la chaine: "toto toto toto r tutu z toto toto" je souhaite ressortir tout ce qui se trouve entre "r" et "z"
j'ai donc mis en place une petite regex

Code:
<?php
$chaine = "toto toto toto r tutu z toto toto";
$chaine = preg_replace('^#(.*)r(.*)z(.*)#$i', '$2', $chaine);
echo $chaine;
?>

Mais malheureusement ça ne fonctionne pas, quelqu'un peut-il m'aider ? je ne suis pas certain qu'il faille prendre preg_replace d'ailleurs.
Merci d'avance
 
WRInaute accro
preg_match est probablement plus indiqué, mais c'est surtout ta regexp qui pose problème... les ^ et $ devraient être à l'intérieur des # (qui servent à encadrer la regex elle-même, en fait, et séparer les flags qui se trouvent après). Et si tu n'as pas besoin de certains bouts, ne mets pas de (), ça ne les capturera pas... Et comme tu veux ignorer ce qu'il y a au début ou à la fin, tu peux carrément les virer avec les ^ et $

Donc '#r(.*)z#i' devrait largement suffire (note que ça ne tient pas compte du fait que r ou z soient au milieu d'un mot ou pas).

Et http://php.net/manual/en/function.preg-match.php devrait mieux faire l'affaire.

Jacques.
 
WRInaute discret
jcaron a dit:
preg_match est probablement plus indiqué, mais c'est surtout ta regexp qui pose problème... les ^ et $ devraient être à l'intérieur des # (qui servent à encadrer la regex elle-même, en fait, et séparer les flags qui se trouvent après). Et si tu n'as pas besoin de certains bouts, ne mets pas de (), ça ne les capturera pas... Et comme tu veux ignorer ce qu'il y a au début ou à la fin, tu peux carrément les virer avec les ^ et $

Donc '#r(.*)z#i' devrait largement suffire (note que ça ne tient pas compte du fait que r ou z soient au milieu d'un mot ou pas).

Et http://php.net/manual/en/function.preg-match.php devrait mieux faire l'affaire.

Jacques.


Merci beaucoup de ton aide Jacques,
Oui effectivement j'ai fais une erreur dans mon exemple, d'habitude du place correctement les ^ et $ :oops:
Par contre la méthode que tu m'indique fonctionne mais ne semble pas correspondre à mon besoin.
En effet preg_match me retourne un booléen selon que la chaine de caractère existe ou non, mon but à moi est justement d'isoler cette chaine de caractères du reste du texte.
 
WRInaute accro
ben64btz a dit:
Par contre la méthode que tu m'indique fonctionne mais ne semble pas correspondre à mon besoin.
En effet preg_match me retourne un booléen selon que la chaine de caractère existe ou non, mon but à moi est justement d'isoler cette chaine de caractères du reste du texte.
Il retourne un booléen, mais c'est le (3°) paramètre "$matches" qui t'intéresse dans ce cas.
 
WRInaute accro
donc c'est bien le preg_match qui va t'aider, en notifiant la variable de retour dans laquelle tu vas récupérer tes données sous forme de tableau
 
WRInaute discret
Bon si vous tombez par hasard sur ce topic, voici la réponse :)

Code:
<?php
$subject = "toto toto toto r tutu z toto toto";
$pattern = '/r (.*) z/';
preg_match($pattern, $subject, $matches);
echo $matches[1];
?>
 
WRInaute discret
Bon si vous tombez par hasard sur ce topic avec la même problématique, voici la réponse :)

Code:
<?php
$subject = "toto toto toto r tutu z toto toto";
$pattern = '/r (.*) z/';
preg_match($pattern, $subject, $matches);
echo $matches[1];
?>
 
WRInaute discret
ok maintenant un second problème avec la même regex.
J'aimerai cette fois, non pas retourner la première occurrence trouvée dans la chaine, mais TOUTES les occurrences de la chaine.

si on reprend la regex précédente on a:

Code:
<?php
$subject = "toto toto toto r tutu z toto toto r voiture z r chat z";
$pattern = '/r (.*) z/i';
preg_match($pattern, $subject, $matches);
echo $matches[1];
?>

Mais ici $matches[1] ne retourne que tutu.
Ce que j'aimerai c'est que la regex me retourne tutu voiture chat

J'ai cherché sur le net mais je ne trouve pas la solution, quelqu'un peut_il m'aider s'il vous plait :roll:
Merci d'avance :)
 
Discussions similaires
Haut