Разделить текстовую строку на $first и $last name в php
Я разрабатываю частную систему сообщений, которая позволяет пользователям искать пользователя по их полному имени, например: "Джордж Вашингтон".
У меня есть две переменные с именем $firstname
и $lastname
, а функция поиска упорядочивает результаты по релевантности (сколько раз вы отправляли сообщение этому человеку). Как получить текстовое поле для разделения "Джордж Вашингтон" на $firstname="George"
и $lastname="Washington"
?
Ответы
Ответ 1
Мне нравится ответ cballou, потому что есть попытка проверить, есть ли только имя. Я думал, что я добавлю свои функции для всех, кто приходит посмотреть.
Простая функция с использованием регулярных выражений (слово char и дефисы)
- Предполагается, что фамилия будет одним словом.
- Не делает никаких предположений об отчестве, что все просто сгруппировано в имя.
- Вы можете использовать его снова, в результате "имя", чтобы получить первое и среднее, хотя.
Вот код:
// 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('#'.$last_name.'#', '', $name ) );
return array($first_name, $last_name);
}
Пример 1: split_name('Angeler')
выводит:
array(
0 => 'Angeler',
1 => ''
);
Пример 2: split_name('Angeler Mcgee')
выводит:
array(
0 => 'Angeler',
1 => 'Mcgee'
);
Пример 3: split_name('Angeler Sherlee Mcgee')
выводит:
array(
0 => 'Angeler Sherlee',
1 => 'Mcgee'
);
Чтобы разделить имя и отчество,
Пример 4: split_name('Angeler Sherlee')
выводит:
array(
0 => 'Angeler',
1 => 'Sherlee'
);
Другая функция - обнаруживает отчество
Позже я решил, что было бы неплохо автоматически определить второе имя, если это применимо, поэтому я написал эту функцию.
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('#'.$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;
}
Пример 1: split_name('Angeler Sherlee Mcgee')
выводит:
array(
'first_name' => 'Angeler',
'middle_name' => 'Sherlee',
'last_name' => 'Mcgee'
);
Пример 2: split_name('Angeler Mcgee')
выводит:
array(
'first_name' => 'Angeler',
'middle_name' => '',
'last_name' => 'Mcgee'
);
Другой путь - без регулярных выражений
Решили добавить еще один способ, который не использует регулярные выражения.
Он также имеет return false;
для нераспознаваемых имен (ноль, пустая строка, слишком много групп слов для вывода).
<?php
function split_name($string) {
$arr = explode(' ', $string);
$num = count($arr);
$first_name = $middle_name = $last_name = null;
if ($num == 2) {
list($first_name, $last_name) = $arr;
} else {
list($first_name, $middle_name, $last_name) = $arr;
}
return (empty($first_name) || $num > 3) ? false : compact(
'first_name', 'middle_name', 'last_name'
);
}
var_dump(split_name('Angela Mcgee'));
var_dump(split_name('Angela Bob Mcgee'));
var_dump(split_name('Angela'));
var_dump(split_name(''));
var_dump(split_name(null));
var_dump(split_name('Too Many Names In Here'));
Выходы
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
Ответ 2
Самый простой способ, используя explode:
$parts = explode(" ", $name);
После того, как у вас есть части, вставьте последнюю как $lastname
:
$lastname = array_pop($parts);
Наконец, верните остаток массива как ваше $firstname
:
$firstname = implode(" ", $parts);
пример:
$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: $lastname\n";
echo "Firstname: $firstname\n";
В результате:
tomatech:~ ariefbayu$ php ~/Documents/temp/test.php
Lastname: ddd
Firstname: aaa bbb ccc
Ответ 3
Если у вас есть ровно 2-словный ввод, вы можете использовать list()
list($firstname, $lastname) = explode(" ", $string);
В любом случае вы можете использовать explode()
$words = explode(" ", $string);
$firstname = $words[0];
$lastname = $words[1];
$third_word = $words[2];
// ..
Ответ 4
В моей ситуации мне просто нужен простой способ получить первый и последний, но учтите основные средние имена:
$parts = explode(' ', 'Billy Bobby Johnson'); // $meta->post_title
$name_first = array_shift($parts);
$name_last = array_pop($parts);
$name_middle = trim(implode(' ', $parts));
echo 'First: ' . $name_first . ', ';
echo 'Last: ' . $name_last . ', ';
echo 'Middle: ' . $name_middle . '.';
Вывод:
Сначала: Билли, Последнее: Джонсон, Середина: Бобби.
Конечно, если вы серьезно хотите разумного разбора имен, то что-то вроде this (или подобное) может быть полезным.
Ответ 5
list($firstname, $lastname) = explode(' ', $fullname,2);
Ответ 6
http://php.net/manual/en/function.explode.php
$string = "George Washington";
$name = explode(" ", $string);
echo $name[0]; // George
echo $name[1]; // Washington
Ответ 7
Здесь ответ с некоторыми проверками границ.
В то время как ответы, приведенные выше, верны, они не предоставляют никаких условий проверки условий, чтобы убедиться, что вы действительно имеете действительное имя для начала. Вы можете пойти об этом с помощью проверки strpos()
, чтобы увидеть, существует ли пространство. Вот более обстоятельный пример:
function split_name($name)
{
$name = trim($name);
if (strpos($name, ' ') === false) {
// you can return the firstname with no last name
return array('firstname' => $name, 'lastname' => '');
// or you could also throw an exception
throw Exception('Invalid name specified.');
}
$parts = explode(" ", $name);
$lastname = array_pop($parts);
$firstname = implode(" ", $parts);
return array('firstname' => $firstname, 'lastname' => $lastname);
}
Стоит отметить, что это предполагает, что lastname - это одно слово, тогда как первое имя может быть любой комбинацией. Для противоположного эффекта замените array_pop()
на array_shift()
.
Ответ 8
function getFirstName($name) {
return implode(' ', array_slice(explode(' ', $name), 0, -1));
}
function getLastName($name) {
return array_slice(explode(' ', $name), -1)[0];
}
$name = 'Johann Sebastian Bach';
$firstName = getFirstName($name);
$lastName = getLastName($name);
echo "first name: $firstName\n";
echo "last name: $lastName\n";
Результат:
first name: Johann Sebastian
last name: Bach
Ответ 9
Это будет игнорировать середину и просто получить первое и последнее.
function split_name($name) {
$parts = explode(" ", $name);
$lastname = array_pop($parts);
while(count($parts) > 1)
{
array_pop($parts);
}
$firstname = implode(" ", $parts);
$name = array(
'first_name' => $firstname,
'last_name' => $lastname,
);
return $name;
}
Ответ 10
Я использую это, он даже разделяет имена с и, & и/и т.д., где есть несколько имен
function getNames($namestrs){
$allnames= array();
$namestrs = trim($namestrs);
$namestrs = str_replace(array(',',' and ',' & ', '&','/'),'|',$namestrs);
$namestrs = explode('|',$namestrs);
foreach($namestrs as $key=> $namestr){
$namestr = explode(' ',trim($namestr) );
if(count($namestr)==1 || (count($namestr)==2 && strlen(trim($namestr[1]) )<3)){
$firstname = $namestr[0];
if(isset( $namestr[1])){
$middlename = $namestr[1];
}
else{
$middlename ='';
}
$lastname='';
$thenames = $namestrs; //print_r($thenames); //echo $key;
$thenames = array_slice($thenames, $key+1, NULL, TRUE); //print_r($thenames);
foreach($thenames as $c=>$a){
$a = explode(' ',trim($a) );// print_r( $a);
if(count($a)>1 && trim($lastname) ==''){
$lastname = $a[count($a)-1];
}
}
}
else if(count($namestr)==2){
$firstname = $namestr[0];
$middlename = '';
$lastname = $namestr[1];
}
else if(count($namestr)==3){
$firstname = $namestr[0];
$middlename = $namestr[1];
$lastname = $namestr[2];
}
else if(count($namestr)>3){
$firstname = $namestr[0];
$middlename = $namestr[1];
$lastname = str_replace(array( $firstname,$middlename ),"", implode(' ',$namestr));
$lastname = trim($lastname);
}
if($lastname=='3rd') {
$lastname = trim($middlename) ." " .trim($lastname) ;
$middlename ='';
}
$allnames[] = array('firstname'=>$firstname,'middlename'=>$middlename,'lastname'=>$lastname );
}
return $allnames;
}
Пример выходных Ханна и Михайлово Ильяшевич
Array
([0] => Array ([firstname] => Hanna [middlename] => [фамилия] => Ильяшевич)
[1] => Array
(
[firstname] => Mykhoylo
[middlename] =>
[lastname] => Ilyashevych
)
)
Ответ 11
Я нашел, что это служило моим потребностям лучше. Первое имя берется в качестве имени, а остальное - в качестве фамилии.
function splitName($name) {
$name = trim($name);
$name = explode(' ', $name);
$first_name = $name[0];
unset($name[0]);
$last_name = implode(' ', $name);
return array($first_name, $last_name);
}
Ответ 12
Таким образом, мой вариант использования состоял в том, чтобы извлечь имя доктора на основе неподготовленного пользователя. Поэтому я написал эту функцию, чтобы обнаружить сценарий последней запятой и различные названия и суффиксы, с которыми я могу столкнуться.
Предположения
- Это, вероятно, потребует некоторой тонкой настройки, поскольку это еще не было бета-тестирование. Я постараюсь не забыть обновить этот пост, когда я исправлю функцию.
- Список префиксов/суффиксов необходимо будет настраивать для каждого варианта использования, поскольку полный список будет фактически вреден для функциональности. (например, "Миссис Бишоп" или "Доктор Ма" будет пустым)
- Также извлекается только средняя инициализация, а вторые имена за пределами первой встречной игнорируются.
Код
function extractName($name)
{
// Common/expected prefixes.
$prefix_list = array(
'mr',
'mrs',
'miss',
'ms',
'dr',
'doctor',
);
// Common/expected suffixes.
$suffix_list = array(
'md',
'phd',
'jr',
'sr',
'III',
);
$parts = explode(' ', $name);
// Grab the first name in the string.
do
{
$first_name = array_shift($parts);
} while ($first_name && in_array(str_replace('.', '', strtolower($first_name)), $prefix_list));
// If the first name ends with a comma it is actually the last name. Adjust.
if (strpos($first_name, ',') === (strlen($first_name) - 1))
{
$last_name = substr($first_name, 0, strlen($first_name) - 1);
$first_name = array_shift($parts);
// Only want the middle initial so grab the next text in the array.
$middle_name = array_shift($parts);
// If the text is a suffix clear the middle name.
if (in_array(str_replace('.', '', strtolower($middle_name)), $suffix_list))
{
$middle_name = '';
}
}
else
{
// Retrieve the last name if not the leading value.
do
{
$last_name = array_pop($parts);
} while ($last_name && in_array(str_replace('.', '', strtolower($last_name)), $suffix_list));
// Only want the middle initial so grab the next text in the array.
$middle_name = array_pop($parts);
}
return array($first_name, $last_name, substr($middle_name, 0, 1));
}
Выход
![enter image description here]()
Ответ 13
Вот очень простой способ разделить полное имя на имя и фамилию
$name = "John Smith";
$firstname = strtok($name, ' ');
echo trim($firstname); // Output: John
$lastname = strstr($name, ' ');
echo trim($lastname); // Output: Smith
С фамилией
$name = "Angeler Sherlee Mcgee";
$firstname = strtok($name, ' ');
echo trim($firstname); // Output: Angeler
$lastname = strstr($name, ' ');
echo trim($lastname); // Output: Sherlee Mcgee
Ответ 14
Код:
$data='9790,2015-04-04'
$result=explode(','$data);
echo $result[0];
echo $result[1];
Выход:
9790
2015-04-04