Post by Sebastiaan 'CrashandDie' LauwersPost by EdoPourquoi 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' LauwersLes 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' Lauwersstrtoupper ('$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' LauwersIci, 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)