Разделить текстовую строку на $ first и $ last name в php

Я разрабатываю частную систему сообщений, которая позволяет пользователям искать пользователя по их полному имени, например: «Джордж Вашингтон».

У меня есть две переменные с именем $firstname и $lastname , а функция поиска заказывает результаты по релевантности (сколько раз вы отправляли сообщение этому человеку). Как получить текстовое поле для разделения «Джордж Вашингтон» на $firstname="George" и $lastname="Washington" ?

Мне нравится ответ 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); } 

Ex 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' ); 

Другой способ – Sans Regex

Решил добавить другой способ, который не использует регулярное выражение.

Он также return false; для не распознаваемых имен (нуль, пустая строка, слишком много групп слов для вывода).

 <?php function split_name($string) { $arr = explode(' ', $string); $num = count($arr); 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 : array( 'first_name' => $first_name, 'middle_name' => $middle_name, 'last_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] => [last_name] => Mcgee ) Array ( [first_name] => Angela [middle_name] => Bob [last_name] => Mcgee ) Array ( [first_name] => Angela [middle_name] => [last_name] => ) false false false 

Самый простой способ – с помощью взрыва:

 $parts = explode(" ", $name); 

После того, как у вас есть части, поместите последний как $lastname :

 $lastname = array_pop($parts); 

Наконец, отмените остальную часть массива как ваше $firstname :

 $firstname = implode(" ", $parts); 

пример:

 $name = "aaa bbb ccc ddd"; $parts = explode(" ", $name); $lastname = array_pop($parts); $firstname = implode(" ", $parts); echo "Lastname: $lastname\n"; echo "Firstname: $firstname\n"; 

Результат:

 tomatech:~ ariefbayu$ php ~/Documents/temp/test.php Lastname: ddd Firstname: aaa bbb ccc 

если у вас есть ровно 2-словный ввод, вы можете использовать list()

 list($firstname, $lastname) = explode(" ", $string); 

в любом случае вы можете использовать explode()

 $words = explode(" ", $string); $firstname = $words[0]; $lastname = $words[1]; $third_word = $words[2]; // .. 

В моей ситуации мне просто нужен простой способ получить первый и последний, но учет основных средних имен:

 $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 . '.'; 

Вывод:

Сначала: Билли, Последнее: Джонсон, Середина: Бобби.

Конечно, если вы серьезно хотите получить разумный анализ имен, то что-то вроде этого (или подобного) может быть полезно.

http://php.net/manual/en/function.explode.php

 $string = "George Washington"; $name = explode(" ", $string); echo $name[0]; // George echo $name[1]; // Washington 
 list($firstname, $lastname) = explode(' ', $fullname,2); 

Вот ответ с некоторой проверкой границ.

Хотя приведенные выше ответы верны, они не предоставляют никаких условий проверки условий, чтобы убедиться, что вы действительно имеете действительное имя для начала. Вы можете пойти об этом с помощью проверки 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() .

 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 

Код:

 $data='9790,2015-04-04' $result=explode(','$data); echo $result[0]; echo $result[1]; 

Вывод:

 9790 2015-04-04