2012-01-04 23 views
37

Todo, Estoy tratando de insertar un apellido en una base de datos. Me gustaría que la primera letra se escriba en mayúscula para el nombre y si usan dos apellidos, escriba en mayúscula el primer y el segundo nombre. Así por ejemplo, si alguien entra en:Hacer la primera letra en mayúscula y el resto en minúscula en una cadena

marriedname maidenname

Sería convertir esto en Marriedname Maidenname y así sucesivamente, si hay más de dos nombres. El otro escenario es que es alguien que tiene un apóstrofo en su nombre, por lo que hay alguna forma de hacerlo si alguien entra en:

O'Connell

Esto necesitaría para convertir a O'Connell. Yo estaba usando:

ucfirst(strtolower($last_name)); 

Sin embargo, como puede ver, eso no funcionaría en todos los escenarios. Gracias por cualquier consejo!

+1

¿Qué hay de DeVries * *? : -3 – deceze

+1

@deceze jaja buen punto. Supongo que solo espero que mecanografíen eso correctamente :) – user1048676

+0

, incluso si lo hacen, estás en minúsculas. –

Respuesta

30

Esto capitalizará todas las primeras letras de la palabra y las letras inmediatamente después de un apóstrofo. Hará que todas las otras letras sean minúsculas. Se debe trabajar para usted:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name)))); 
+1

Increíble pequeño fragmento! – FastTrack

+0

Exactamente lo que necesitaba. ¡Gracias! – user1105056

+0

¡¿Cómo es esto increíble ?! Hace que los puntos y comas aparezcan después de cada barra inclinada que ya puede estar en la cadena de origen, y solo capta Palabras después de punto y coma, que ni siquiera es el carácter tipográfico correcto. – j4k3

1

Usted puede utilizar preg_replace con la bandera e (ejecutar una función php):

function processReplacement($one, $two) 
{ 
    return $one . strtoupper($two); 
} 

$name = "bob o'conner"; 
$name = preg_replace("/(^|[^a-zA-Z])([a-z])/e","processReplacement('$1', '$2')", $name); 

var_dump($name); // output "Bob O'Conner" 

Tal vez el patrón de expresión se puede mejorar, pero lo que he hecho es :

  • $1 es o bien el inicio de la línea o cualquier carácter no alfabético.
  • $2 es cualquier carácter alfabético en minúscula

A continuación, reemplace ambas de las personas con el resultado de la función simple processReplacement().

Si tiene PHP 5.3, probablemente valga la pena hacer que processReplacement() sea una función anónima.

0

Primero convierta en caso de título, luego encuentre el primer apóstrofo y mayúscula el carácter SIGUIENTE. Deberá agregar muchos controles para asegurarse de que haya un carácter después del apóstrofo y este código solo funcionará en un apóstrofo. p.ej. "Mary O'Callahan O'connell".

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8"); 
$pos = strpos($str, "'"); 
if ($pos != FALSE) 
{ 
    $str[$pos+1] = strtoupper($str[$pos+1]); 
} 
2

No creo que haya una buena respuesta que cubra todos los escenarios para usted. El foro PHP.net para ucwords tiene una buena cantidad de discusiones, pero ninguna parece tener una respuesta para todos. Yo recomendaría estandarizar ya sea usar mayúsculas o dejar solo la entrada del usuario.

4

Utilice esta función incorporada:

ucwords('string'); 
+0

Esto se convertiría en 'StRinG' si la palabra era' stRinG'. No lo minúsculas todo. – emotality

+1

Entonces 'ucwords (strtolower ('stRing'))'? –

19

Ninguno de estos son UTF8 amable, así que aquí está uno que funciona a la perfección (hasta ahora)

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("and", "to", "of", "das", "dos", "I", "II", "III", "IV", "V", "VI")) 
{ 
    /* 
    * Exceptions in lower case are words you don't want converted 
    * Exceptions all in upper case are any words you don't want converted to title case 
    * but should be converted to upper case, e.g.: 
    * king henry viii or king henry Viii should be King Henry VIII 
    */ 
    $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)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtoupper($word, "UTF-8"); 
      } elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) { 
       // check exceptions list for any words that should be in upper case 
       $word = mb_strtolower($word, "UTF-8"); 
      } elseif (!in_array($word, $exceptions)) { 
       // convert to uppercase (non-utf8 only) 
       $word = ucfirst($word); 
      } 
      array_push($newwords, $word); 
     } 
     $string = join($delimiter, $newwords); 
    }//foreach 
    return $string; 
} 

Uso:

$s = 'SÃO JOÃO DOS SANTOS'; 
$v = titleCase($s); // 'São João dos Santos' 
1

Esta es una respuesta un poco más simple y más directa a la pregunta principal. la función a continuación imita los enfoques de PHP. Solo en caso de que PHP amplíe esto con sus espacios de nombres en el futuro, primero se verifica una prueba. Estoy usando esta prueba de agua para cualquier idioma en mis instalaciones de WordPress.

$str = mb_ucfirst($str, 'UTF-8', true); 

Esto hace la primera letra mayúscula y todas las demás minúsculas como Q. Si el tercer arg se establece en falso (predeterminado), el resto de la cadena no se manipula.

// Extends PHP 
if (!function_exists('mb_ucfirst')) { 

function mb_ucfirst($str, $encoding = "UTF-8", $lower_str_end = false) { 
    $first_letter = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding); 
    $str_end = ""; 
    if ($lower_str_end) { 
     $str_end = mb_strtolower(mb_substr($str, 1, mb_strlen($str, $encoding), $encoding), $encoding); 
    } else { 
     $str_end = mb_substr($str, 1, mb_strlen($str, $encoding), $encoding); 
    } 
    $str = $first_letter . $str_end; 
    return $str; 
} 

} 

/Lundman

+1

Me puede estar faltando algo, pero parece que esto solo hace que la primera letra de la Cadena esté en mayúscula. La pregunta original era cómo hacer la primera letra de todas las palabras contenidas dentro de una mayúscula de cadena. – DB5

19

puede probar esto por resultado

<?php echo ucwords(strtolower('Dhaka, JAMALPUR, sarishabari')) ?> 

de palabra es: Dhaka, Jamalpur, Sarishabari

+0

Solo agregando el enlace de documentación para este artículo. http://php.net/manual/en/function.ucfirst.php –

0

uso como esto ucfirst(strtolower($var));

Cuestiones relacionadas