15 Stimmen

Kennt jemand eine elegante Funktion, um Namen richtig zu schreiben?

Der Kindergarten 101 lehrt einige von uns, dass: "Die Buchstaben in Ihrem Namen sollten klein geschrieben werden, mit Großbuchstaben als erste Buchstaben." Doch in diesem post-literarischen Zeitalter scheint es davon abzuhängen, wie die Leute ihre Namen in Webformularen eingeben, je nach ihrer Stimmung oder Sonnenflecken oder was auch immer: komplett großgeschrieben, komplett kleingeschrieben, gemischt, auf den Kopf gestellt...

Philosophisch gesehen sage ich egal! Besetze deinen Namen, wen interessiert's. Aber ich habe OCD-Kunden, die Daten standardisiert, normalisiert und vorhersehbar sehen möchten. Deshalb frage ich euch, ob ihr schon einmal gut durchdachte PHP-Funktionen zur Groß- und Kleinschreibung von Namen gesehen habt, die die verschiedenen Ausnahmen berücksichtigen, die ucwords() völlig vermasseln würde, wie z.B.:

  • Sven-Alex Crumpet
  • Ronaldo McDonaldo
  • Boopsie O'Brien
  • J.R. Bob Dobbs
  • Francesca de los Gatos
  • YungCheng Li

Gibt es Funktionen, die diese Alphabetrebellen berücksichtigen?

UPDATE
Aus Robin v. G.'s Standpunkt gibt es kein Skript, das alle regiert. Aber ich habe entschieden, dass Namen, die vollständig in Klein- oder Großbuchstaben eingegeben werden, wahrscheinlich gute Kandidaten für eine gründliche Reinigung sind. Also werde ich für diese folgendes tun...

    if ($name == strtoupper($name) || $name == strtolower($name)) {
        $name = ucwords(strtolower($name));
    }

Es wäre leicht genug, dies zu ändern, um ein paar wahrscheinliche Ausnahmen zu korrigieren: Bindestriche, Apostrophe, 'McD', usw. Fehler werden gemacht, aber wer wird sich beschweren? Nicht der erbärmliche Bastard, der seinen Namen in Kleinbuchstaben eingegeben hat.

Oh warte, mein Name steht in Kleinbuchstaben...

8voto

Sherlock Punkte 7309

Dies ist einfach unmöglich.

Die Schreibweise von Namen variiert von Land zu Land, wie Sie in Ihrer Frage zeigen. Der einfachste Weg ist es, die häufigste Schreibweise zu finden, und das wäre jede erste Buchstabe jedes 'Wortes' zu groß schreiben, d.h. jede Zeichenkette, die von einem Leerzeichen, Bindestrich, Punkt oder Apostroph gefolgt wird.

Dies löst nicht alle Ihre Probleme (YungCheng, McDonaldo) und lässt Sie auch mit anderen Problemen zurück, aber das ist so nah dran, wie Sie kommen werden.

Vergleichen Sie:

  • Alex Van Halen (US-Schreibweise)
  • Alex van Halen (korrekte niederländische Schreibweise)

Es gibt keinen Algorithmus, der dieses Problem löst.

Dieser Artikel zeigt das Problem mit niederländischen Namen sehr gut auf, und das ist nur eine Sprache. Es gibt wahrscheinlich einen Artikel wie diesen für jede Sprache der Welt. ;)

6voto

davidkonrad Punkte 80852

Hier ist ein Versuch

$names=array();
$names[]="sven-alex crumpet";
$names[]="RONALDO McDonalDO";
$names[]="Boopsie o'Brien";
$names[]="j.r. BOB DOBBS";
$names[]="francesca DE LOS gatOS";
$names[]="yungcheng LI";
$names[]="mr hankey";
$names[]="santas little helper";
$names[]="j.r.r. tolkien";

$splitters=array(' ','.',"'",'-'); //more to come
$fixedNames=array();

foreach($names as $name) {
    $fixed='';
    $blank=str_replace($splitters,'?',$name);
    $n=explode('?',$blank);
    foreach($n as $f) $fixed.=ucfirst(strtolower($f)).' ';
    for ($i=0;$i';
print_r($fixedNames);
echo '

1voto

Dan Francis Punkte 47

Während dies jetzt eine ziemlich alte Frage ist:

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc", "Mac"), $exceptions = array("and", "to", "of", "das", "dos", "de", "do", "da", "los", "von", "van", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X")) {
    /*
     * Ausnahmen in Kleinbuchstaben sind Wörter, die nicht in den Titel umgewandelt werden sollen
     * Ausnahmen, die ausschließlich in Großbuchstaben vorliegen, sind Wörter, die nicht in den Titel umgewandelt werden sollen
     *   aber in Großbuchstaben umgewandelt werden sollen, z.B.:
     *   König Heinrich VIII oder König Heinrich Viii sollte zu König Heinrich VIII werden
     */
    $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)) {
                // Überprüfen Sie die Ausnahmeliste auf Wörter, die in Großbuchstaben sein sollten
                $word = mb_strtoupper($word, "UTF-8");
            } else if (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
                // Überprüfen Sie die Ausnahmeliste auf Wörter, die in Kleinbuchstaben sein sollten
                $word = mb_strtolower($word, "UTF-8");
            } else if (!in_array($word, $exceptions)) {
                // in Großbuchstaben umwandeln (nicht-utf8)
                $word = ucfirst($word);
            }
            array_push($newwords, $word);
        }
        $string = join($delimiter, $newwords);
    } //foreach
    return $string;
}

Es funktioniert nicht für YungCheng, aber es funktioniert für so ziemlich alles andere. Das einzige Problem ist, wenn der $string NUR ein Nachname wie "do Carmo" ist, dann wird "Do Carmo" zurückgegeben. Es ist eigentlich für vollständige Namen gemacht, also wenn Sie $string = "frederick do carmo"; eingeben, wird dann "Frederick do Carmo" zurückgegeben. Hoffentlich hilft das ein wenig.

-1voto

ooXei1sh Punkte 3279

Ich habe eine anständige Bibliothek gefunden, um verschiedene menschliche Namen in verschiedenen Formaten zu behandeln, die in Python namens nameparser geschrieben wurde. Es behandelt immer noch nicht alle oben aufgeführten Namen, aber mit einiger Konfiguration könnten Sie nah dran sein.

Ich habe auch einen kurzen Blog verfasst, der beschreibt, wie man die Nameparser-Bibliothek von der Konsole aus zum Laufen bringt. Vielleicht hilft es jemandem.

Hier ist das grundlegende Python-Skript:

import sys
import json
from nameparser import HumanName

rawname = ' '.join(sys.argv[1:]).lower().strip()

name = HumanName(rawname)

# Versuch, den Namen in Titelformat zu korrigieren
name.capitalize()

print json.dumps({
    'fullname': name.__str__(),
    'title': name.title,
    'first': name.first,
    'middle': name.middle,
    'last': name.last,
    'suffix': name.suffix,
    'nickname': name.nickname
})

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X