tambien se me ocurre otra forma utilizando ucfirst() combinado tambien con strtolower(), este ultimo metodo te podria servir mas en el caso de tratar con apellidos compuestos (de las Mercedes, del Carmen, de la Fuente , etc)... el idea consiste en separar mediante un explode() la cadena que contiene el nombre o lo que quiereas tratar...luego a cada elemento aplicas la funcion ucfirst(strtolower($elementoArray)), SI y SOLO SI no es un 'articulo' (la, las, de...)...
mas menos asi
la hice a modo de funcion :)
Código PHP:
function Capitalizar($nombre)
{
// aca definimos un array de articulos (en minuscula)
// aunque lo puedes definir afuera y declararlo global aca
$articulos = array(
'0' => 'a',
'1' => 'de',
'2' => 'del',
'3' => 'la',
'4' => 'los',
'5' => 'las',
);
// explotamos el nombre
$palabras = explode(' ', $nombre);
// creamos la variable que contendra el nombre
// formateado
$nuevoNombre = '';
// parseamos cada palabra
foreach($palabras as $elemento)
{
// si la palabra es un articulo
if(in_array(trim(strtolower($elemento)), $articulos))
{
// concatenamos seguido de un espacio
$nuevoNombre .= strtolower($elemento)." ";
} else {
// sino, es un nombre propio, por lo tanto aplicamos
// las funciones y concatenamos seguido de un espacio
$nuevoNombre .= ucfirst(strtolower($elemento))." ";
}
}
return trim($nuevoNombre);
}