Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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);

Ответ 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 ',' & ', '&amp;','/'),'|',$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