Estate atento porque en esta reseña vas a hallar la solución que buscas.
Solución:
La forma más sencilla es, mediante el uso de explotar:
$parts = explode(" ", $name);
Después de tener las partes, haga estallar la última como $lastname
:
$lastname = array_pop($parts);
Finalmente, haga implosionar el resto del array como tu $firstname
:
$firstname = implode(" ", $parts);
ejemplo:
$name = "aaa bbb ccc ddd";
$parts = explode(" ", $name);
if(count($parts) > 1)
$lastname = array_pop($parts);
$firstname = implode(" ", $parts);
else
$firstname = $name;
$lastname = " ";
echo "Lastname: $lastnamen";
echo "Firstname: $firstnamen";
Podría resultar:
tomatech:~ ariefbayu$ php ~/Documents/temp/test.php
Lastname: ddd
Firstname: aaa bbb ccc
Me gusta la respuesta de cballou porque hay un esfuerzo por verificar si solo hay un nombre. Pensé en agregar mis funciones para cualquier otra persona que venga a buscar.
Función simple, usando Regex (palabra char y guiones)
- Supone que el apellido será una sola palabra.
- No hace ninguna suposición sobre los segundos nombres, que todo simplemente se agrupa en el primer nombre.
- Sin embargo, podría usarlo nuevamente, en el resultado del “primer nombre” para obtener el primero y el medio.
Aquí está el código:
// uses regex that accepts any word character or hyphen in last name
function split_name($name)
$name = trim($name);
$last_name = (strpos($name, ' ') === false) ? '' : preg_replace('#.*s([w-]*)$#', '$1', $name);
$first_name = trim( preg_replace('#'.preg_quote($last_name,'#').'#', '', $name ) );
return array($first_name, $last_name);
Ej. 1: split_name('Angeler')
salidas:
array(
0 => 'Angeler',
1 => ''
);
Ej. 2: split_name('Angeler Mcgee')
salidas:
array(
0 => 'Angeler',
1 => 'Mcgee'
);
Ej. 3: split_name('Angeler Sherlee Mcgee')
salidas:
array(
0 => 'Angeler Sherlee',
1 => 'Mcgee'
);
Para dividir el primer y segundo nombre,
Ej. 4: split_name('Angeler Sherlee')
salidas:
array(
0 => 'Angeler',
1 => 'Sherlee'
);
Otra función: también detecta segundos nombres
Más tarde decidí que sería bueno tener el segundo nombre resuelto automáticamente, si corresponde, así que escribí esta función.
function split_name($name)
$parts = array();
while ( strlen( trim($name)) > 0 )
$name = trim($name);
$string = preg_replace('#.*s([w-]*)$#', '$1', $name);
$parts[] = $string;
$name = trim( preg_replace('#'.preg_quote($string,'#').'#', '', $name ) );
if (empty($parts))
return false;
$parts = array_reverse($parts);
$name = array();
$name['first_name'] = $parts[0];
$name['middle_name'] = (isset($parts[2])) ? $parts[1] : '';
$name['last_name'] = (isset($parts[2])) ? $parts[2] : ( isset($parts[1]) ? $parts[1] : '');
return $name;
Ej. 1: split_name('Angeler Sherlee Mcgee')
salidas:
array(
'first_name' => 'Angeler',
'middle_name' => 'Sherlee',
'last_name' => 'Mcgee'
);
Ej. 2: split_name('Angeler Mcgee')
salidas:
array(
'first_name' => 'Angeler',
'middle_name' => '',
'last_name' => 'Mcgee'
);
Otra manera – Sans Regex
Decidió agregar otra forma que no usa expresiones regulares.
También tiene return false;
para nombres no reconocibles (nullvacío stringdemasiados grupos de palabras para inferir).
Salidas
Array
(
[first_name] => Angela
[middle_name] => NULL
[last_name] => Mcgee
)
Array
(
[first_name] => Angela
[middle_name] => Bob
[last_name] => Mcgee
)
Array
(
[first_name] => Angela
[middle_name] => NULL
[last_name] => NULL
)
false
false
false
si tiene exactamente una entrada de 2 palabras, puede usar list()
list($firstname, $lastname) = explode(" ", $string);
de todos modos puedes usar explode()
$words = explode(" ", $string);
$firstname = $words[0];
$lastname = $words[1];
$third_word = $words[2];
// ..
Sección de Reseñas y Valoraciones
Si te ha resultado de ayuda este artículo, te agradeceríamos que lo compartas con otros programadores de esta manera nos ayudas a dar difusión a este contenido.