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

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

Jak można się spodziewać wyjścia dla "MaryHasACat"? –

Odpowiedz

17

Co o coś takiego:

$string = "MaryGoesToSchool"; 

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

to:

  • dopasowuje wielkie litery
  • i zastąpić każdą z nich spacją, a co zostało dopasowane


Który daje to wyjście:

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


a następnie można użyć:

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

Aby usunąć przestrzeń na początku, który dostaje:

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

Co jeśli łańcuch ma już wiodące białe znaki? – Gumbo

+0

Następnie 'preg_replace ('/ * ([A-Z]) /', '$ 1', $ string);'. – kennytm

6

Spróbuj tego:

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

W \p{…} notacje opisują znaki poprzez Unicode character properties; \p{Ll} oznacza małą literę i \p{Lu} wielką literę.

Innym podejściem byłoby to:

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

Tutaj każda wielka litera jest poprzedzany tylko z miejsca, jeśli jest poprzedzone innym liście. Więc zadziała MaryHasACat.

1

Oto non-regex rozwiązanie, które ja użyj do sformatowania łańcucha camelCase do bardziej czytelnego formatu:

<?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 - dlaczego? – alexn

0

Spróbuj:

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