2010-01-10 8 views
9
$string = "MaryGoesToSchool"; 

$expectedoutput = "Mary Goes To School"; 
+0

Comment pensez-vous de la sortie pour "MaryHasACat"? –

Répondre

17

Qu'en est-il quelque chose comme ceci:

$string = "MaryGoesToSchool"; 

$spaced = preg_replace('/([A-Z])/', ' $1', $string); 
var_dump($spaced); 

Ce:

  • Matchs les lettres majuscules
  • et REPLACE chacun d'eux par un espace, et ce qui a été apparié


Qui donne cette sortie:

string ' Mary Goes To School' (length=20) 


Et vous pouvez utiliser:

$trimmed = trim($spaced); 
var_dump($trimmed); 

Pour supprimer l'espace au début, ce qui vous permet de vous:

string 'Mary Goes To School' (length=19) 
+3

Que faire si la chaîne a déjà des espaces blancs? – Gumbo

+0

Puis 'preg_replace ('/ * ([A-Z]) /', '$ 1', $ chaîne);'. – kennytm

6

Essayez ceci:

$expectedoutput = preg_replace('/(\p{Ll})(\p{Lu})/u', '\1 \2', $string); 

Les notations \p{…} décrivent des caractères via Unicode character properties; \p{Ll} indique une lettre minuscule et \p{Lu} une lettre majuscule.

Une autre approche serait:

$expectedoutput = preg_replace('/\p{Lu}(?<=\p{L}\p{Lu})/u', ' \0', $string); 

Ici, chaque lettre majuscule n'est préfixé avec un espace si elle est précédée d'une autre lettre. Donc, MaryHasACat fonctionnera également.

1

Voici une solution non-regex qui i utiliser pour formater une chaîne camelCase dans un format plus lisible:

<?php 
function formatCamelCase($string) { 
     $output = ""; 
     foreach(str_split($string) as $char) { 
       strtoupper($char) == $char and $output and $output .= " "; 
       $output .= $char; 
     } 
     return $output; 
} 

echo formatCamelCase("MaryGoesToSchool"); // Mary Goes To School 
echo formatCamelCase("MaryHasACat"); // Mary Has A Cat 
?> 
+0

Downvoter - pourquoi? – alexn

0

Essayez:

$string = 'MaryGoesToSchool'; 
$nStr = preg_replace_callback('/[A-Z]/', function($matches){ 
    return $matches[0] = ' ' . ucfirst($matches[0]); 
}, $string); 
echo trim($nStr); 
Questions connexes