2012-01-04 16 views
37

Wszystko, Próbuję wstawić nazwisko do bazy danych. Chciałbym, aby pierwsza litera była pisana wielką literą dla nazwy, a jeśli używają dwóch nazwisk, wtedy należy wpisać pierwsze i drugie imię. Tak na przykład, jeśli ktoś wejdzie:Utwórz pierwszą wielką literę i pozostałą małą literę w ciągu znaków

marriedname maidenname

Byłoby przekonwertować to do Marriedname Maidenname i tak dalej, jeśli jest więcej niż dwóch imion. Drugi scenariusz jest to ktoś musi apostrof w ich imieniu, więc jest tam mimo to zrobić, jeśli ktoś wejdzie:

O'Connell

To trzeba konwertować do O'Connell. Używałem:

ucfirst(strtolower($last_name)); 

Jednak, jak można się przekonać, to nie zadziałałoby dla wszystkich scenariuszy. Dzięki za radę!

+1

Co o * DeVries *? : -3 – deceze

+1

@deceze haha ​​dobry punkt. Sądzę, że po prostu mam nadzieję, że wpiszą to poprawnie :) – user1048676

+0

, nawet jeśli to robisz, to go obniżacie. –

Odpowiedz

30

Spowoduje to wielką literą wszystkie pierwsze litery słowa i litery bezpośrednio po apostrofu. Sprawi, że wszystkie pozostałe litery będą małe. Powinien pracować dla Ciebie:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name)))); 
+1

Awesome little snippet! – FastTrack

+0

Dokładnie to, czego potrzebowałem. Dzięki! – user1105056

+0

Jak to jest niesamowite ?! Po każdym ukośniku, który może już znajdować się w łańcuchu źródłowym, pojawiają się średniki i przechwytuje tylko słowa po średnikach, co nie jest nawet poprawną typograficznie postacią. – j4k3

1

Można użyć preg_replace z flagą e (wykonać funkcję php):

function processReplacement($one, $two) 
{ 
    return $one . strtoupper($two); 
} 

$name = "bob o'conner"; 
$name = preg_replace("/(^|[^a-zA-Z])([a-z])/e","processReplacement('$1', '$2')", $name); 

var_dump($name); // output "Bob O'Conner" 

Może być ulepszona wzór regex, ale to, co zrobiłem jest :

  • $1 jest albo początek linii lub każdy non-alfabetycznym.
  • $2 jest każdy małej litery alfabetu

Następnie zastąpić zarówno tych z wynikiem prostego processReplacement() funkcji.

Jeśli masz PHP 5.3, prawdopodobnie warto uczynić processReplacement() anonimową funkcją.

0

Najpierw skonwertuj na tytuł, następnie znajdź pierwszy apostrof i wielką literę NEXT. Będziesz musiał dodać wiele kontroli, aby upewnić się, że po apostrofu znajduje się znak, a ten kod będzie działał tylko na jednym apostrofu. na przykład "Mary O'Callahan O'connell".

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8"); 
$pos = strpos($str, "'"); 
if ($pos != FALSE) 
{ 
    $str[$pos+1] = strtoupper($str[$pos+1]); 
} 
2

Nie sądzę, że będzie jedna dobra odpowiedź, która obejmuje wszystkie scenariusze dla ciebie. Forum PHP.net dla ucwords ma sporą liczbę dyskusji, ale wydaje się, że nie ma na nie odpowiedzi. Polecam, abyś standaryzował używając wielkich liter lub pozostawiając tylko dane użytkownika.

4

Funkcja ta funkcja wbudowana:

ucwords('string'); 
+0

To zmieniłoby się w 'StRinG', jeśli słowo było' stRinG'. Nie będzie to małe. – emotality

+1

Więc 'ucwords (strtolower ('stRing'))'? –

19

Żaden z nich są UTF8 przyjazny, więc tutaj jest jeden, który działa bez zarzutu (jak dotąd)

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("and", "to", "of", "das", "dos", "I", "II", "III", "IV", "V", "VI")) 
{ 
    /* 
    * Exceptions in lower case are words you don't want converted 
    * Exceptions all in upper case are any words you don't want converted to title case 
    * but should be converted to upper case, e.g.: 
    * king henry viii or king henry Viii should be King Henry VIII 
    */ 
    $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8"); 
    foreach ($delimiters as $dlnr => $delimiter) { 
     $words = explode($delimiter, $string); 
     $newwords = array(); 
     foreach ($words as $wordnr => $word) { 
      if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtoupper($word, "UTF-8"); 
      } elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtolower($word, "UTF-8"); 
      } elseif (!in_array($word, $exceptions)) { 
       // convert to uppercase (non-utf8 only) 
       $word = ucfirst($word); 
      } 
      array_push($newwords, $word); 
     } 
     $string = join($delimiter, $newwords); 
    }//foreach 
    return $string; 
} 

Zastosowanie:

$s = 'SÃO JOÃO DOS SANTOS'; 
$v = titleCase($s); // 'São João dos Santos' 
1

To jest nieco prostsza i bardziej bezpośrednia odpowiedź na główne pytanie. poniższa funkcja naśladuje podejścia PHP. Na wypadek gdyby PHP rozszerzyło to o ich przestrzenie nazw w przyszłości, najpierw sprawdzany jest test. Używam tego wodoodpornego dla wszystkich języków w moich instalacjach wordpress.

$str = mb_ucfirst($str, 'UTF-8', true); 

To powoduje, że pierwsza litera jest wielka i wszystkie inne małe litery, jak Q. Jeśli trzeci argument jest ustawiony na wartość false (domyślnie), reszta łańcucha nie jest manipulowana.

// Extends PHP 
if (!function_exists('mb_ucfirst')) { 

function mb_ucfirst($str, $encoding = "UTF-8", $lower_str_end = false) { 
    $first_letter = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding); 
    $str_end = ""; 
    if ($lower_str_end) { 
     $str_end = mb_strtolower(mb_substr($str, 1, mb_strlen($str, $encoding), $encoding), $encoding); 
    } else { 
     $str_end = mb_substr($str, 1, mb_strlen($str, $encoding), $encoding); 
    } 
    $str = $first_letter . $str_end; 
    return $str; 
} 

} 

/Lundman

+1

Może brakuje mi czegoś, ale wydaje mi się, że tylko pierwsza litera wielkiej litery String? Pierwotne pytanie brzmiało, jak zrobić pierwszą literę wszystkich słów zawartych w wielkiej skrzynce. – DB5

19

można spróbować to dla wyrazu

<?php echo ucwords(strtolower('Dhaka, JAMALPUR, sarishabari')) ?> 

wyniku jest: Dhaka, Jamalpur, Sarishabari

+0

Wystarczy dodać link do dokumentacji tego anwer. http://php.net/manual/en/function.ucfirst.php –

0

wykorzystanie takich jak ten ucfirst(strtolower($var));

Powiązane problemy