2009-07-30 4 views
9

Je cherche une fonction pour capitaliser correctement les noms comme McDonald, FitzGerald, MacArthur, O'Lunney, Theo de Raadt, etc.Quelqu'un at-il une fonction PHP pour capitaliser correctement les noms des personnes?

Est-ce que quelqu'un sait d'un qui fonctionne bien? Je suppose que n'importe quelle fonction ne va pas supporter toutes les possibilités.

Bien sûr, ucwords seul ne fonctionne pas pour cela car il capitalise simplement la première lettre de chaque mot.

Editer: Je sais qu'il y aura des problèmes et toutes les possibilités ne seront pas supportées. Mais le problème à l'heure actuelle est que j'ai une base de données d'environ 50 000 noms qui sont pour la plupart entrés en majuscules et il serait pénible de devoir éditer chacun d'eux sans causer d'erreurs d'orthographe. Avoir un script qui provoque un problème avec 20% serait beaucoup plus rapide et entraînerait beaucoup moins d'erreurs.

+3

Vous ne pouvez pas avoir beaucoup de chance avec cette question car certains noms ne sont pas toujours capitalisés de la façon dont vous pensez qu'ils devraient être. Par exemple, j'ai vu Fitzgerald beaucoup plus souvent que FitzGerald. Et qui dit que ça ne devrait pas être un trait d'union, comme Fitz-Gerald? – Tim

+0

Ce qui est dit ci-dessous; et aussi, beaucoup de noms hollandais (par exemple) n'ont pas tous les premiers caractères en majuscule, comme "Theo de Raadt". – MSpreij

Répondre

6

Peut-être que vous avez besoin de quelque chose comme ça ucwords function note

+0

J'ai vu celui-ci en regardant autour et ça a l'air plutôt bien. Il y a aussi quelques autres qui ont l'air bien. Fondamentalement se demander si quelqu'un en a un qu'ils ont utilisé et ont trouvé des travaux bien. –

3

Vous êtes probablement conscient de cela, mais un énorme problème que vous rencontrerez est qu'il y a plus d'une majuscule «correcte» de certains noms - dans votre exemple, je ne suis pas d'accord avec FitzGerald, par exemple.

+0

C'est vrai, mais encore une fois, c'est juste une solution générale. À l'heure actuelle, j'ai une base de données où> 50% des gens sont entrés avec toutes les majuscules. –

0

En général, j'utilise

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

pratique si vous stockez _ au lieu des espaces dans votre base de données, ou de les utiliser dans urls, poignées noms césure bien aussi.

vu aussi ce quelque part qui semble faire un bon travail dans la plupart des cas

/** 
    * @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; 
    } 

noms comme Jurgen Macho (footballeur) est retourné comme Jurgen Macho cependant, comme l'a fait dans d'autres réponses et commentaires, noms sont durs.

Questions connexes