2009-07-30 5 views
9

Ich bin auf der Suche nach einer Funktion, um Namen wie McDonald, FitzGerald, MacArthur, O'Lunneys, Theo de Raadt usw. richtig zu kapitalisieren.Hat jemand eine PHP-Funktion, um Namen richtig zu schreiben?

Kennt jemand eine, die gut funktioniert? Ich schätze, jede Funktion wird nicht jede Möglichkeit unterstützen.

Natürlich funktioniert ucwords allein nicht dafür, weil es nur den ersten Buchstaben jedes Wortes groß schreibt.

Edit: Ich weiß, dass es Probleme geben wird und alle Möglichkeiten werden nicht unterstützt werden. Aber das Problem ist jetzt, dass ich eine Datenbank mit ungefähr 50 000 Namen habe, die meistens in Großbuchstaben eingegeben werden, und es wäre ein Schmerz in den Arsch, jeden zu bearbeiten, ohne Rechtschreibfehler zu verursachen. Ein Skript, das ein Problem mit 20% verursacht, wäre viel schneller und würde viel weniger Fehler verursachen.

+3

Sie können nicht viel Glück mit dieser Frage haben, da einige Namen nicht immer in der Weise kapitalisiert werden, wie Sie denken, dass sie sein sollten. Zum Beispiel habe ich Fitzgerald viel öfter gesehen als FitzGerald. Und wer soll sagen, es sollte kein Bindestrich sein wie Fitz-Gerald? – Tim

+0

Was hierunter gesagt wird; und auch, viele holländische Namen (zum Beispiel) haben nicht alle die ersten Zeichen großgeschrieben, wie "Theo de Raadt". – MSpreij

Antwort

6

Vielleicht brauchen Sie so etwas wie diese ucwords function note

+0

Ich habe das gesehen, während ich mich umsah und es sieht ziemlich gut aus. Es gibt auch ein paar andere, die gut aussehen. Ich frage mich, ob jemand eine hat, die er benutzt hat und gute Arbeit gefunden hat. –

3

Sie sind sich dessen wahrscheinlich bewusst, aber ein riesiges Problem besteht darin, dass es mehr als eine "korrekte" Großschreibung einiger Namen gibt - in Ihrem Beispiel würde ich beispielsweise FitzGerald nicht zustimmen.

+0

Das ist wahr, aber es ist nur eine allgemeine Lösung. Im Moment habe ich eine Datenbank, in der> 50% aller Personen mit Großbuchstaben eingegeben werden. –

0

Im Allgemeinen verwende ich

$output = trim(implode('-', array_map('ucfirst', explode('-', ucwords(strtolower(str_replace('_',' ',$input))))))); 

praktisch, wenn Sie _ statt Leerzeichen in Ihrer DB speichern, oder sie in URLs, Griffen Doppelnamen zu gut.

sah auch diese irgendwo, die einen guten Job in den meisten Fällen

/** 
    * @param $string 
    * @return string 
    */ 
    public function titleCase($string) 
    { 

     $word_splitters = array(' ', '-', "O'", "L'", "D'", 'St.', 'Mc', 'Mac'); 
     $lowercase_exceptions = array('the', 'van', 'den', 'von', 'und', 'der', 'de', 'di', 'da', 'of', 'and', "l'", "d'"); 
     $uppercase_exceptions = array('III', 'IV', 'VI', 'VII', 'VIII', 'IX'); 

     $string = strtolower($string); 
     foreach ($word_splitters as $delimiter) { 
      $words = explode($delimiter, $string); 
      $newwords = array(); 
      foreach ($words as $word) { 
       if (in_array(strtoupper($word), $uppercase_exceptions)) 
        $word = strtoupper($word); 
       else 
        if (!in_array($word, $lowercase_exceptions)) 
         $word = ucfirst($word); 

       $newwords[] = $word; 
      } 

      if (in_array(strtolower($delimiter), $lowercase_exceptions)) 
       $delimiter = strtolower($delimiter); 

      $string = join($delimiter, $newwords); 
     } 
     return $string; 
    } 

Namen wie Jürgen Macho (Fußballer), wie Jürgen Macho obwohl zurückgegeben zu tun scheint, wie in anderen Antworten und Kommentaren darauf hingewiesen, Namen sind hart.

Verwandte Themen