toscho.design

PHP-Funktion Genitiv

Über den Deppenapostroph hat sich bestimmt jeder schon einmal geärgert, der Wert auf gutes Deutsch legt. Umso nerviger ist schlecht übersetzte Software, die einem dann doch hinterrücks einen Apostroph oder ein falsches Genitiv-S dorthin setzt, wo es nicht hingehört.

Dabei ist die Regel sehr einfach: Ein Apostroph (U+2019) wird immer dann gesetzt, wenn das Wort mit s, ß, x, z oder ce endet. Ansonsten benutzt man ein Genitiv-S. Niemals beides.

Peters Schuhe und Hans Jacke.

Diese PHP-Funktion gibt immer die richtige Form zurück:

function genitiv($word)
{
    // U+2019 oder s
    $suffix = 's';
    $word   = trim($word);
    if ( in_array ( substr($word, -1), array('s', 'ß', 'x', 'z') ) )
    {
        $suffix = '';
    }
    if ( 'ce' == substr($word, -2) )
    {
        // Alice’ Tante
        $suffix = '';
    }
    return $word . $suffix; 
}

Nachtrag (14. Juli, 2009): Diese Funktion steht jetzt als Online-Tool im Labor.

4 Kommentare

  1. Lars Kasper am 17.03.2009 · 11:02

    Mich gruselt es nach jedem Einloggen auf Amazon.de: »Larss Amazon.de«.

  2. Thomas Scholz am 17.03.2009 · 11:18

    Ja, mein Nachname lädt immer wieder zum Verhunzen ein, daher kenne ich das.
    Schön, mal wieder was von dir zu lesen, Lars.

  3. mark am 25.08.2010 · 15:46

    nice
    auf deiner idee basierend hab ichs noch etwas verfeinert:

       * correct genitive form of a noun
       * @param string $word
       * @param bool enforceApostrophe
       * @return string $result
       * @see http://de.wikipedia.org/wiki/Genitiv
       * @static
       * 2010-08-25 ms
       */
      function genitive($word, $enforceApostrophe = false) {
        $suffix = 's';
        $word   = trim($word);
        if (in_array(mb_substr($word, -1), array('s', 'ß', 'x', 'z'))) {
          // Hans’ Tante
          $suffix = '’';
        } elseif ('ce' == (mb_substr($word, -2))) {
          // Alice’ Tante
          $suffix = '’';
        } elseif ($enforceApostrophe) {
          // Nach neuer Rechtschreibung ist "Peter's" etc wieder zulässig, wenn damit die Grundform eines Personennamens verdeutlicht werden soll.
          $suffix = '’'.'s';
        }
        return $word . $suffix;
      }

    test cases:

    $this->assertEqual(DeSpecific::genitive('Mario'), 'Marios');
    $this->assertEqual(DeSpecific::genitive('Mario', true), 'Mario’s');
    # apop
    $this->assertEqual(DeSpecific::genitive('Hans'), 'Hans’');
    $this->assertEqual(DeSpecific::genitive('Hans', true), 'Hans’');
    $this->assertEqual(DeSpecific::genitive('Bruce'), 'Bruce’');
    $this->assertEqual(DeSpecific::genitive('Bruce', true), 'Bruce’');
    $this->assertEqual(DeSpecific::genitive('He Weiß'), 'He Weiß’');
    $this->assertEqual(DeSpecific::genitive('He Weiß', true), 'He Weiß’');
    $this->assertEqual(DeSpecific::genitive('Merz'), 'Merz’');
    $this->assertEqual(DeSpecific::genitive('Merz', true), 'Merz’');
    
  4. Thomas Scholz am 25.08.2010 · 15:59

    @mark: Wann braucht man die kompromittierte Form, wenn man doch die saubere erzeugen kann?