2012-01-23 32 views
13

Estoy buscando una forma de mayúscula de la primera letra/s de una cadena, incluyendo donde los nombres están unidos por un guión, como adam smith- Jones debe ser Adam Smith-Jones.Cómo mayúscula en la primera letra después de un guión, es decir, Adam Smith-Jones

ucwords() (o ucfirst() si les dividió en nombre, apellido) sólo hace Adam Smith-Jones

+2

haciendo suposiciones importantes sobre los nombres. http://old.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ –

+0

artículo muy lindo, pero el autor es un desarrollador de software y no un administrador de db que ha visto muchos casos de la vida real . El DB que usa mi cliente tiene numerosas personas con el problema anterior, puede que no sea Smith-Jones, sino más bien Salafi-Verjastani – MonOve

+0

Está haciendo grandes suposiciones sobre los nombres. http://cowbelljs.blogspot.com/2012/01/whats-in-name-database.html – Incognito

Respuesta

22
$string = implode('-', array_map('ucfirst', explode('-', $string))); 
0
<?php 
    // note - this does NOT do what you want - but I think does what you said 
    // perhaps you can modify it to do what you want - or we can help if you can 
    // provide a bit more about the data you need to update 
    $string_of_text = "We would like to welcome Adam Smith-jones to our 3rd, 'I am addicted to stackoverflow-posting' event."; 
    // both Smith-Jones and Stackoverflow-Posting should result 
    // may be wrong 
    $words = explode(' ',$string_of_text); 

    foreach($words as $index=>$word) { 
     if(false !== strpos('-',$word)) { 
      $parts = explode('-',$word); 
      $newWords = array; 
      foreach($parts as $wordIndex=>$part) { 
      $newWords[] = ucwords($part); 
      } 
      $words[$index] = implode('-',$newWords); 
     } 
    } 

    $words = implode(' ',$words); 

?> 

Algo parecido a esto - no probado - a los efectos de hacer seguro de entender la pregunta.

7

¿Esto está bien?

function to_upper($name) 
    { 
     $name=ucwords($name); 
     $arr=explode('-', $name); 
     $name=array(); 
     foreach($arr as $v) 
     { 
      $name[]=ucfirst($v); 
     } 
     $name=implode('-', $name); 
     return $name; 
    } 
    echo to_upper("adam smith-jones"); 
4

Otra forma:

<?php 

$str = 'adam smith-jones'; 

echo preg_replace("/(-)([a-z])/e","'\\1'.strtoupper('\\2')", ucwords($str)); 

?> 
+2

El modificador '/ e' está en desuso. Simplemente use 'preg_replace_callback()' en su lugar. –

1
/** 
* Uppercase words including after a hyphen 
* 
* @param string $text lower-case text 
* @return string Upper-Case text 
*/ 
function uc_hyphenated_words($text) 
{ 
    return str_replace("- ","-",ucwords(str_replace("-","- ",$text))); 
} 
6

¿Qué opina sobre el siguiente código?

mb_convert_case(mb_strtolower($value), MB_CASE_TITLE, "UTF-8"); 

Tenga en cuenta que esto también maneja caracteres acentuados (útiles para algunos idiomas como el francés).

+4

incluso mejor: mb_convert_case (mb_strtolower ($ value, "UTF-8"), MB_CASE_TITLE, "UTF-8"); – wanted

Cuestiones relacionadas