Discussion:
Fonction PHP dans expressions regulieres ?
(trop ancien pour répondre)
Edo
2007-06-10 10:33:14 UTC
Permalink
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 ?
Sebastiaan 'CrashandDie' Lauwers
2007-06-10 13:06:33 UTC
Permalink
Post by Edo
Bonjour,
Bonjour,
Post by Edo
Pourquoi est-ce que ce code ne fonctionne pas ?
PICNIC, pas PHP
Post by Edo
$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
Post by Edo
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.
Olivier Miakinen
2007-06-10 18:38:36 UTC
Permalink
Post by Sebastiaan 'CrashandDie' Lauwers
Post by 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
Post by Sebastiaan 'CrashandDie' Lauwers
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.
Post by Sebastiaan 'CrashandDie' Lauwers
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.
Post by Sebastiaan 'CrashandDie' Lauwers
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.
Post by Sebastiaan 'CrashandDie' Lauwers
$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
2007-06-11 05:58:28 UTC
Permalink
Post by Olivier Miakinen
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...
Post by Olivier Miakinen
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 ?
Post by Olivier Miakinen
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...
Post by Olivier Miakinen
Pas mieux, puisque le $1 n'a pas de sens en dehors du preg_replace. Ce
[...]
Non oui ok, désolé, j'avoue que j'avais zappé l'histoire de $1... Merci
pour la rectification...

S.
Olivier Miakinen
2007-06-11 09:55:52 UTC
Permalink
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).
Post by Olivier Miakinen
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 ?
Post by Olivier Miakinen
[...]
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'.

Mihamina (R12y) Rakotomandimby
2007-06-10 18:38:36 UTC
Permalink
Post by Edo
Bonjour,
Bonjour,
Post by Edo
$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?
Continuer la lecture sur narkive:
Loading...