2010-09-29 9 views
0

Prenez deux cordes:Nice moyen facile de capitaliser des noms tels que "o'sullivan"?

"o'sulLivAn" 
"doUble-baRrel" 

Résultat souhaité:

"O'Sullivan" 
"Double-Barrel" 

Je pensais que ucwords(strtolower($str)) pourrait faire l'affaire, mais il traite les cordes comme un seul mot.

Je sais que je peux explode, ou plutôt preg_split la chaîne et ensuite capitaliser les pièces et les remettre ensemble, mais je me demande s'il y a une meilleure façon de le faire?

Habituellement, avec PHP et ce genre de chose, il y a une fonction cachée quelque part qui serait utile mais pas évidente ou bien connue.

+0

Ce problème est très difficile en raison des variations énormes comment les noms sont capitalisés. Si vous voulez vraiment simplement mettre en majuscule après un caractère non-alpha, alors le fractionnement et le réassemblage sont probablement les plus faciles à coder. Cependant, considérez une entrée comme "vanhalen" ou "thooft", qui pourrait être "VanHalen" et "tHooft", ou "vanHalen". Que faites-vous avec "vandermies", qui pourrait valablement être "VanDerMies", ou "vanDerMies"? Est-ce que c'est une partie du problème que vous essayez de résoudre? –

+0

@Jim Heureusement non! Si l'utilisateur entre une chaîne de cette manière, il devra être traité comme il l'a saisi. – bcmcfc

Répondre

1

Il n'y a pas de fonction php pour ce faire.

est ici un one-liner sans boucle (un peu)

$str1 = "double-barrel"; 
$str2 = "o'sulLivAn"; 


function my_ucase($str, $chars="-'") { 
    return implode(array_map('ucwords', array_map('strtolower', preg_split("~([".$chars."])~", $str, null, PREG_SPLIT_DELIM_CAPTURE)))); 
} 

echo my_ucase($str1); 
echo my_ucase($str2); 
3

Vous pouvez utiliser preg_replace_callback ici:

$lines = array(
    "o'sulLivAn", 
    "doUble-baRrel", 
); 

function upcaseLetters($match){ 
    return strtoupper($match[0]); 
} 

foreach($lines as $line){ 
    echo preg_replace_callback('#^[\w]|[\W][\w]#','upcaseLetters',strtolower($line))."<br/>"; 
} 

Sorties:

O'Sullivan 
Double-Barrel 
+0

^1 c'est plus simple à comprendre que la réponse choisie. Je vous remercie. – verbumSapienti

1

Si vous ne me dérange pas le modificateur e:

preg_replace('!(^|\W)[a-z]!e', "strtoupper('\\0')", strtolower($text)); 
+0

oui, c'est la voie à suivre. L'expression rationnelle peut être simplifiée en '\ b [a-z]' – user187291

Questions connexes