Funktion ucwords() - Erstes Zeichen jedes Worts in Großbuchstaben umwandeln

In PHP-Programmen liegen Strings häufig nicht in der gewünschten Form vor und müssen umgewandelt werden. Beispielsweise werden in Suchanwendungen die Keywords in der Datenbank oft in Kleinbuchstaben abgelegt. Ein häufiger Wunsch hierbei ist, dass bei der Darstellung die Keywords mit einem Großbuchstaben beginnen sollen. Falls der String nur ein Wort enthält, kann man für die Umwandlung des ersten Zeichens die Funktion ucfirst() verwenden. Es kann sein, dass der String mehrere Wörter enthält und alle Wörter des Strings mit einem Großbuchstaben beginnen sollen. In dem Fall kann die Funktion ucwords() verwendet werden. Die Parameter werden dabei wie folgt angegeben.

  1. Die Zeichenkette für die Umwandlung des ersten Zeichens (string).
  2. Wort-Trennzeichen (delimiters, ab PHP 5.4.32 und 5.5.16, optional).

Falls der zweite Parameter (delimiters) nicht angegeben wird, gelten die folgenden Zeichen als Wort-Trennzeichen.

  • Leerzeichen
  • Seitenvorschub
  • Zeilenvorschub
  • Wagenrücklauf
  • Horizontaler Tabulator
  • Vertikaler Tabulator

Der Standardwert für den delimiters würde dem Wert ' \t\r\n\f\v' entsprechen. Beim folgenden Beispiel werden die ersten Zeichen der beiden Wörter kuchen und torte in Großbuchstaben umgewandelt.

<?php

$str = 'kuchen torte';

// Ausgabe Kuchen Torte
echo ucwords($str);

?>

Da in der Standardeinstellung auch Zeilenvorschübe als Wort-Trennzeichen behandelt werden, können die beiden Wörter auch untereinander stehen und das erste Zeichen würde in Großbuchstaben umgewandelt werden.

<?php

$str = '
kuchen 
torte
sahne
';

// Ausgabe Kuchen Torte Sahne
echo ucwords($str);

?>

Über den zweiten Parameter (delimiters) kann man auch eigene Wort-Trennzeichen angeben. Allerdings gilt hier die Einschränkung, dass das nur ab der PHP-Version 5.4.32 und 5.5.16 funktioniert. Beim folgenden Beispiel wird der Stern als Wort-Trennzeichen verwendet. Das Trennzeichen wird beim Rückgabewert nicht entfernt.

<?php

$str = 'kuchen*torte*sahne';

// Ausgabe Kuchen*Torte*Sahne
echo ucwords($str, '*'); 

?>

Falls mit der verwendeten PHP-Version die Angabe des zweiten Parameters nicht möglich ist, kann man eine eigene Funktion schreiben. Beim folgenden Beispiel sorgt die Funktion ucwordsnew() dafür, dass man Wort-Trennzeichen angeben kann und das jeweils erste Zeichen danach in Großbuchstaben umgewandelt wird.

<?php

function ucwordsnew($words, $delimiters = null) {

  // ucwords falls keine Trennzeichen
  if (!isset($delimiters)) {
    return ucwords($words);
  }
    
  // Variablen setzen
  $nextcapitalize = true;
  $length = strlen($words);

  // Schleife
  for ($i = 0;  $i < $length; $i++) 
  {
    if (strpos($delimiters, $words[$i]) !== false) 
    {
      $nextcapitalize = true;
    } 
    else if ($nextcapitalize) 
    {
      $nextcapitalize = false;
      $words[$i] = strtoupper($words[$i]);
    }
  }
  return $words;
}

$str = 'kuchen*torte*sahne';

// Ausgabe Kuchen*Torte*Sahne
echo ucwordsnew($str, '*'); 

?>

Diese Lösung hat den Nachteil, dass Umlaute nicht in Großbuchstaben umgewandelt werden. Bei der folgenden Lösung würden mit der Funktion ucwords_utf8() auch die Umlaute umgewandelt werden.

<?php

function ucwords_utf8($words, $delimiters = null) {

  // ucwords falls keine Trennzeichen
  if (!isset($delimiters)) {
    return mb_convert_case($words, MB_CASE_TITLE, 'UTF-8');
  }

  $words = str_replace($delimiters, ' ', $words);
  $words = mb_convert_case($words, MB_CASE_TITLE, 'UTF-8');
  $words = str_replace(' ', $delimiters, $words);
   
  return $words;
}

$str = 'übung*öffnen*ändern';

// Ausgabe Übung*Öffnen*Ändern
echo ucwords_utf8($str, '*'); 

?>

Falls beim Aufruf von ucwords_utf8() kein Wort-Trennzeichen angegeben wurde, erfolgt die Umwandlung der ersten Zeichen vom Wörtern direkt über die Multibyte-Funktion mb_convert_case(). Falls über den zweiten Parameter ein Wort-Trennzeichen angegeben wurde, werden zunächst die Wort-Trennzeichen in Leerzeichen umgewandelt. Danach erfolgt die Umwandlung mit mb_convert_case(). Zum Schluss werden die Leerzeichen durch das Wort-Trennzeichen ersetzt. Auf dem Server muss die Erweiterung mbstring zur Verfügung stehen, damit mb_convert_case() genutzt werden kann.