Resultat preg_replace

Eléphant du PHP | 224 Messages

13 nov. 2010, 11:54

Bonjour à tous :)

Voici mon petit problème du jour :

Je tente de parser une petite chaîne de caractères avec un "preg_replace", mais je n'obtiens que du texte alors que je devrais avoir un array :shock:

Voici mon petit code :
$sTxt = '[un|deux|trois]';
$sMsq = '!\[(.*)\]!e';
$aRes = preg_replace($sMsq, 'explode("|", "$1")', $sTxt);
Voici le résultat avec "print_r" :
print_r($aRes);
// Array
Et voici un coup de "var_dump" :
var_dump($aRes);
// string(5) "Array"
Comprends vraiment pas :cry: quelqu'un aurait une idée :?:

Merci à tous :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 nov. 2010, 16:30

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
(...)
preg_replace() retourne un tableau si le paramètre subject est un tableau, ou une chaîne sinon.
Tu passes une chaine en 3ème argument de preg_replace, du coup tu récupères une chaine... Ton explode retourne bien un tableau, mais quand celui-ci est renvoyé par la fonction, cela donne la chaine "Array" :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 224 Messages

13 nov. 2010, 17:37

Tu passes une chaine en 3ème argument de preg_replace, du coup tu récupères une chaine... Ton explode retourne bien un tableau, mais quand celui-ci est renvoyé par la fonction, cela donne la chaine "Array" :)
Ha... d a c c o r d ! :lol:

J'aurais bataillé encore longtemps avant de me rendre compte :?

Merci Ryle pour ton aide =D>
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 224 Messages

13 nov. 2010, 18:07

Je reviens à la charge ;)

Et si je voulais extraire tous les texte à l'intérieur de la variable "$sTxt" (en omettant les crochets et les "pipes" bien-sûr), avec une seule Regex, sur un "preg_match_all()" par exemple, ce serait quoi le masque le plus approprié et efficace ? :shock:
$sTxt = '[un|deux|trois]';
Merci :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 nov. 2010, 19:23

Tu peux le faire de différentes façons, en voici déjà une :)
$str = '[un|deux|trois]';
$reg = '#([^\|\[\]]+)#';
preg_match_all($reg, $str, $tab);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 224 Messages

13 nov. 2010, 19:40

Merci Ryle, je vais regarder tout ça ;)

[edit]
Bon, ça marche très bien (je n'aurai pas pensé d'utiliser les exclusions, c'est pas mal je trouve :) ), mais, un truc me chiffonne, la regex traite également les cas des textes qui ne sont pas entourés de crochets, "uno|dos|tres" par exemple, or je ne souhaite traiter que les textes entre crochets (c'est pourquoi j'étais un peu parti sur une méthode à deux traitements au départ avec le "explode()").
Je ne sais pas si c'est bien faisable, si ce n'est pas le cas, je repartirai sur ma première intuition.
Merci en tout cas Ryle pour ton aide =D>
[/edit]
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)