2009-07-30 5 views
9

Busco una función de capitalizar adecuadamente nombres como McDonald, FitzGerald, MacArthur, O'Lunney de, Theo de Raadt, etc.¿Alguien tiene una función de PHP para capitalizar correctamente los nombres de las personas?

¿alguien sabe de uno que funcione bien razonables? Supongo que cualquier función no va a apoyar todas las posibilidades.

Por supuesto, ucwords solo no funciona para esto porque simplemente escribe en mayúscula la primera letra de cada palabra.

Editar: Sé que habrá problemas y no se admitirán todas las posibilidades. Pero el problema ahora es que tengo una base de datos de alrededor de 50 000 nombres que en su mayoría están escritos en mayúsculas y sería un fastidio tener que editar cada uno sin ocasionar errores ortográficos. Tener un script que cause un problema con un 20% sería mucho más rápido y provocaría muchos menos errores.

+3

Puede que no tenga mucha suerte con esta pregunta ya que algunos nombres no siempre se escriben en mayúscula en la forma en que cree que deberían ser. Por ejemplo, he visto Fitzgerald con mucha más frecuencia que FitzGerald. ¿Y quién puede decir que no debería ser un nombre con guiones, como Fitz-Gerald? – Tim

+0

¿Qué hay aquí? y también, muchos nombres holandeses (por ejemplo) no tienen todos los primeros caracteres en mayúscula, como "Theo de Raadt". – MSpreij

Respuesta

6

Tal vez usted necesita algo como esto ucwords function note

+0

Vi este mientras miraba y se ve bastante bien. También hay algunos otros que se ven bien. Básicamente, preguntarse si alguien tiene uno que haya usado y haya encontrado funciona bien. –

3

Probablemente esté al tanto de esto, pero un gran problema que enfrentará es que hay más de una capitalización "correcta" de algunos nombres; en su ejemplo, estaría en desacuerdo con FitzGerald, por ejemplo.

+0

Esto es cierto, pero una vez más, es solo una solución general. En este momento tengo una base de datos donde> 50% de las personas ingresan con mayúsculas. –

0

Generalmente utilizo

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

útil si usted está almacenando _ en lugar de espacios en su base de datos, o utilizarlos en las direcciones URL, se ocupa de los nombres con guión bien también.

también vieron esto en alguna parte que parece hacer un buen trabajo en la mayoría de los casos

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

nombres como Jurgen Macho (futbolista) se devuelve como Jürgen Macho, aunque, como se ha señalado en otras respuestas y comentarios, nombres son difíciles.

Cuestiones relacionadas