Fonction PHP dans expressions regulieres ?

Le
Edo
Bonjour,

Pourquoi est-ce que ce code ne fonctionne pas ?

$string = preg_replace('/ ([a-z]) /', ' '.strtoupper('$1').' ',
$string);

Je m'attendais à ce qu'il mette en majuscule les caractères minuscules
séparés par des espaces dans une chaine. Or ça ne fonctionne pas. Ca
veut dire qu'on ne peut pas insérer d'instructions en PHP dans les
expressions régulières ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sebastiaan 'CrashandDie' Lauwers
Le #46882
Edo wrote:
Bonjour,


Bonjour,

Pourquoi est-ce que ce code ne fonctionne pas ?


PICNIC, pas PHP

$string = preg_replace('/ ([a-z]) /', ' '.strtoupper('$1').' ',
$string);


Alors on résume:

'' = chaine de caractère où rien ne sera interprêté
"" = chaine de caractère dans laquelle les $variables seront remplacées
par leur valeur.
. = concaténation de chaines

Je m'attendais à ce qu'il mette en majuscule les caractères minuscules
séparés par des espaces dans une chaine. Or ça ne fonctionne pas. Ca
veut dire qu'on ne peut pas insérer d'instructions en PHP dans les
expressions régulières ?


Les expression régulières n'ont absolument rien à avoir là dedans. C'est
un problème de SYNThAXE PHP !

strtoupper ('$1'); ne renvoie pas la valeur en majuscule de $1, elle
renvoie la chaine de caractères en majuscules de '$1'. Ici, avec des
simples quotes, $1 est interprêté en tant que tel, en tant que chaine de
caractère pûre.

En somme, strtoupper ('$1') renvoie:
$1

Car '$' et '1' n'ont pas de majuscules affichables.

essayez plutôt:

$string = preg_replace ('/ ([a-z]) /', ' ' . strtoupper ($1) . ' ',
$string);

HTH,

S.

Mihamina (R12y) Rakotomandimby
Le #46879
Edo -
Bonjour,


Bonjour,

$string = preg_replace('/ ([a-z]) /', ' '.strtoupper('$1').' ',
$string);


Je comprends bien que c'esst bien d'avoir du code concis, de temps en temps.
Mais là, ne vaut-il pas mieux décomposer?

Olivier Miakinen
Le #46880
Le 10/06/2007 15:06, Sebastiaan 'CrashandDie' Lauwers répondait à Edo :

Pourquoi est-ce que ce code ne fonctionne pas ?

$string = preg_replace('/ ([a-z]) /', ' '.strtoupper('$1').' ',
$string);

Je m'attendais à ce qu'il mette en majuscule les caractères minuscules
séparés par des espaces dans une chaine. Or ça ne fonctionne pas. Ca
veut dire qu'on ne peut pas insérer d'instructions en PHP dans les
expressions régulières ?



Si, mais RTFM (option e ; et strtoupper doit faire partie de la chaîne
passée à preg_replace, ce qui n'est pas le cas ici).

http://fr2.php.net/preg_replace#id5801655

Les expression régulières n'ont absolument rien à avoir là dedans. C'est
un problème de SYNT[]AXE PHP !


Les deux, mon capitaine. C'est surtout un problème de syntaxe propre à
preg_replace avec l'option e.

strtoupper ('$1'); ne renvoie pas la valeur en majuscule de $1, elle
renvoie la chaine de caractères en majuscules de '$1'.


Plus exactement elle renvoie la chaîne '$1', et c'est donc la chaîne
' $1 ' qui est passée à preg_replace, comme s'il n'y avait pas de
strtoupper du tout.

Ici, avec des
simples quotes, $1 est interprêté en tant que tel, en tant que chaine de
caractère pûre.


Ce ne serait pas mieux en remplaçant les simples quotes par des doubles,
ni d'ailleurs en les supprimant.

essayez plutôt:

$string = preg_replace ('/ ([a-z]) /', ' ' . strtoupper ($1) . ' ',
$string);


Pas mieux, puisque le $1 n'a pas de sens en dehors du preg_replace. Ce
serait plutôt :

$string = preg_replace ('/ ([a-z]) /e', "' ' . strtoupper('\1') . ' '",
$string);

ou :

$string = preg_replace ('/ ([a-z]) /e', "' ' . strtoupper('$1') . ' '",
$string);

Mais ceci devrait marcher aussi :

$string = preg_replace ('/ ([a-z]) /e', "strtoupper(' \1 ')",
$string);

ou :

$string = preg_replace ('/ ([a-z]) /e', "strtoupper(' $1 ')",
$string);

(pas absolumpent certain avec $1 au lieu de \1, mais c'est à essayer)


Sebastiaan 'CrashandDie' Lauwers
Le #46455
Olivier Miakinen wrote:

Les deux, mon capitaine. C'est surtout un problème de syntaxe propre à
preg_replace avec l'option e.


Oh Captain, my Captain,

J'ai jamais rien capté aux expressions régulières, et me suis jamais
penché dessus plus que ça, sauf quand j'en avais besoin rapidement, donc
les particularités, j'avoue que je suis passé dessus un peu vite...

Plus exactement elle renvoie la chaîne '$1', et c'est donc la chaîne
' $1 ' qui est passée à preg_replace, comme s'il n'y avait pas de
strtoupper du tout.


Oui ok, parceque strtoupper () ne peut pas changer '$1' en quoi que ce
soit d'autre, non ?

Ce ne serait pas mieux en remplaçant les simples quotes par des doubles,
ni d'ailleurs en les supprimant.


Hein ?

Aaaah, mais c'est pas parceque $1 vient justement de preg_* ? J'avais
pris ça comme une très très mauvaise habitude de nommage de variables...

Pas mieux, puisque le $1 n'a pas de sens en dehors du preg_replace. Ce
serait plutôt :

[...]


Non oui ok, désolé, j'avoue que j'avais zappé l'histoire de $1... Merci
pour la rectification...

S.

Olivier Miakinen
Le #46453

J'ai jamais rien capté aux expressions régulières, [...]


Il faut dire que là c'est une utilisation un peu complexe, et d'ailleurs
Mihamina Rakotomandimby avait probablement raison en proposant plutôt de
décomposer (peut-être en utilisant preg_replace_callback).

Plus exactement elle renvoie la chaîne '$1', et c'est donc la chaîne
' $1 ' qui est passée à preg_replace, comme s'il n'y avait pas de
strtoupper du tout.


Oui ok, parceque strtoupper () ne peut pas changer '$1' en quoi que ce
soit d'autre, non ?

[...]


Aaaah, mais c'est pas parceque $1 vient justement de preg_* ? J'avais
pris ça comme une très très mauvaise habitude de nommage de variables...


En fait, le problème principal tenait à ce que, dans la proposition
d'Edo comme dans la tienne, la fonction strtoupper() était appelée
*avant* la fonction preg_replace().

Pour simplifier, je reprends les deux cas de figure avec des fonctions
que je nomme f1 et f2 :

1) f1(f2())
-----------
Ici, la fonction f2() est appelée en premier, et c'est sa valeur de
retour qui est passée en paramètre à la fonction f1(), appelée ensuite.

2) f1('f2()')
-------------
Ici c'est la fonction f1() qui est appelée d'abord, avec comme paramètre
la chaîne 'f2()'. Si f1() en décide ainsi, elle peut alors évaluer le
paramètre reçu en supposant que c'est du code, et dans ce cas la
fonction f2() sera appelée à l'intérieur de la fonction f1().

Le cas (1) est celui du code d'Edo ; le cas (2) est celui prévu pour la
fonction preg_replace() avec l'option 'e'.


Publicité
Poster une réponse
Anonyme