2010-11-14 9 views
0

Je rencontre un petit problème. Je suis en train de remplacer les mots phrase-à-direen remplaçant tous les mots en majuscules par ucword

HELLO World WHAT 

par

Hello World What 

jusqu'à présent ont moyen de le détecter:

preg_replace('/(\b[A-Z][A-Z]+\b)/sm','$1', $string); 

mais il ne fait rien que je ne peux pas mettre en un argument ucwords ('$ 1').

Toute aide serait géniale.

acclamations, /Marcin

P.S. ce genre de méthodes ne sont pas bonnes: ucwords (strtolower ($ string)); Comme je veux laisser tout ce qui n'était pas tout en majuscules.

Répondre

2

Il est un peu plus efficace d'utiliser une fonction anonyme plutôt que faire appel au modificateur /e.

$formatted = preg_replace_callback(
     '/(\b[A-Z][A-Z]+\b)/', 
     create_function(
      '$matches', 
      'return ucwords(strtolower($matches[0]));' 
     ), 
     $string 
    ); 
+0

Combien plus efficace? – Marcin

+0

La chaîne de remplacement est essentiellement passée en PHP pour chaque remplacement, par opposition à la méthode de rappel où elle ne doit être passée qu'une seule fois. –

+0

nice, j'ai posté autre question regex, pouvez-vous aider avec ça aussi: http://stackoverflow.com/questions/4177374/detecting-and-replacing-merged-words-myword-to-my-word-php-regex - bravo – Marcin

2

Comment l'utilisation:

ucwords(strtolower($string)); 

Vous pouvez combiner cette approche avec le modificateur e:

preg_replace('/(\b[A-Z][A-Z]+\b)/sme','ucwords(strtolower($1))', $string); 
+0

Ce n'est pas comme somthing ce qui n'a pas été tous les bouchons devraient rester comme il était, mais grâce – Marcin

+0

modifié pour utiliser l'expression rationnelle - devrait maintenant fonctionner sur les majuscules seulement. –

+0

Mais, vous n'utilisez pas le modificateur '/ e' dans cette ligne de code? –