programing

텍스트 문자열을 $first와 $last name(php)으로 나눕니다.

padding 2023. 10. 10. 20:08
반응형

텍스트 문자열을 $first와 $last name(php)으로 나눕니다.

저는 사용자가 자신의 전체 이름으로 사용자를 검색할 수 있는 개인 메시지 시스템을 개발하고 있습니다. 예:"조지 워싱턴".

에게는 라는 두 .$firstname그리고.$lastname를 보낸 ),() 합니다 합니다.Washington"을 "George Washington"까로 해야 ?$firstname="George"그리고.$lastname="Washington"?

가장 간단한 방법은 폭발을 이용하는 것입니다.

$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

이름만 있는지 확인하는 노력이 있어서 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('#'.preg_quote($last_name,'#').'#', '', $name ) );
    return array($first_name, $last_name);
}

Ex 1:split_name('Angeler')출력:

array(
    0 => 'Angeler',
    1 => ''
);

Ex 2:split_name('Angeler Mcgee')출력:

array(
    0 => 'Angeler',
    1 => 'Mcgee'
);

Ex 3:split_name('Angeler Sherlee Mcgee')출력:

array(
    0 => 'Angeler Sherlee',
    1 => 'Mcgee'
);

이름과 중간 이름을 나누려면,

Ex 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('#'.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;
}

Ex 1:split_name('Angeler Sherlee Mcgee')출력:

array(
    'first_name' => 'Angeler',
    'middle_name' => 'Sherlee',
    'last_name' => 'Mcgee'
);

Ex 2:split_name('Angeler Mcgee')출력:

array(
    'first_name' => 'Angeler',
    'middle_name' => '',
    'last_name' => 'Mcgee'
);

Another Way - Sans Regex

regex를 사용하지 않는 다른 방법을 추가하기로 결정했습니다.

그것은 또한 가지고 있습니다.return false;인식할 수 없는 이름(null, 빈 문자열, 추론할 수 있는 단어 그룹이 너무 많음)의 경우.

<?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단어 입력을 가지고 있다면 당신은 사용할 수 있습니다.

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

어쨌든 사용할 수 있는

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

출력:

첫째: 빌리, 마지막: 존슨, 중간: 바비.

list($firstname, $lastname) = explode(' ', $fullname,2);

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

$string = "George Washington";
$name = explode(" ", $string);
echo $name[0]; // George 
echo $name[1]; // Washington

다음은 한계 확인이 포함된 답변입니다.

위의 답변은 맞지만, 실제로 유효한 이름이 있는지 확인하기 위한 어떠한 형태의 경계 조건 검사도 제공하지 않습니다.다를 이을 할 수 .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);
}

여기서 주목할 점은 성이 단일 단어라고 가정하는 반면 이름은 임의의 조합일 수 있다는 것입니다.의 경우합니다.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

그래서 저의 활용 사례는 훈련되지 않은 사용자 입력을 바탕으로 의사의 이름을 추출하는 것이었습니다.그래서 마지막 코마 우선 시나리오와 접할 수 있는 다양한 제목과 접미사를 탐지하기 위해 이 함수를 썼습니다.

가정

  • 아직 베타 테스트가 되지 않았기 때문에 미세 조정이 필요할 것 같습니다.기능을 패치하면서 이 게시물을 업데이트하는 것을 기억하도록 노력하겠습니다.
  • 접두사/접미사 목록은 각 사용 사례에 따라 사용자 정의되어야 합니다. 포괄적인 목록은 실제로 기능에 해롭기 때문입니다.(예: A "부인.비숍" 또는 "마 박사"는 비어 있을 것입니다.)
  • 또한 중간 이니셜만 풀링되고 처음 접한 이름 이상의 중간 이름은 무시됩니다.

코드

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

나는 이 제안을 본 적이 없습니다.

저 같은 경우에는 이름이 몇 개인지와 상관없이 이름을 처음과 끝 두 개의 분야로 나누어야 했습니다.그래서 저는 다음과 같이 했습니다.

$fullName = "Paul Thomas Anderson";
$lastname = end(explode(" ", $fullName));
$firstname = str_replace($lastname,'',$fullName);

그러면 $first name = "Paul Thomas"와 $last name = "Anderson"이 됩니다.

"end()" 명령은 분해된 이름에서 마지막 배열 요소를 가져온 다음 "str_replace"는 전체 이름에서 성을 제거합니다.

중간 이름이 필요 없는 경우 간단한 솔루션입니다.

$name = "John Doe";
$name = trim($username);
$firstName = strtok($name, " "); // John
$lastName = strtok(" "); // Doe

이름 하나만:

$name = "John";
$name = trim($username);
$firstName = strtok($name, " "); // John
$lastName = strtok(" "); // False

https://www.php.net/manual/en/function.strtok.php

이것이 제 요구에 더 잘 맞는다는 것을 알았습니다.첫 번째 단어를 이름으로 하고 나머지를 성으로 묶습니다.

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);
}

이 기능은 이름, 중간 이름, 성, 어머니 성, 결혼한 성(여성의 경우에만 적용됨)을 포함한 스페인어 이름에 대해 잘 작동합니다.이 이름의 형식은 라틴 아메리카에서 매우 흔합니다.

public function split_name(string $name, array $words2join = [], array $remove_prefix = []): object
{
    $result = [];

    $name = strtolower(trim($name));
    $name = preg_replace('/\s+/', ' ', $name);

    $words = explode(' ', $name);

    $name = '';

    foreach($words as $word)
    {
        if (in_array($word, $words2join))
            $word .= '%';
        else
            $word .= ' ';

        $name .= $word;
    }

    $words = explode(' ', trim($name));

    $result['first_name'] = $words[0] ?? '';
    $result['middle_name'] = isset($words[3]) ? (isset($words[2]) ? $words[1] : '') : '';
    $result['last_name'] = isset($words[3]) ? ($words[2] ?? ($words[1] ?? '')) : $words[1] ?? '';
    $result['mother_last_name'] = $words[3] ?? ($words[2] ?? '');
    $result['married_last_name'] = $words[4] ?? '';

    foreach($result as $key => $value)
    {
        $value = ucwords(str_replace('%', ' ', $value));

        if (isset($remove_prefix[$key]))
        {
            $length = strlen($remove_prefix[$key]);

            if (substr($value, 0, $length))
                $value = substr($value, $length + 1, strlen($value));
        }

        $result[$key] = trim($value);
    }


    return (object) $result;
}

예:

$result = K7Text::split_name('Edgardo Hormelis Gomez Gaitan', ['del','de','la'], ['married_last_name' => 'de']);
print_r($result);

$result = K7Text::split_name('Miguel H. Pitty De León', ['del','de','la'], ['married_last_name' => 'de']);
print_r($result);

$result = K7Text::split_name('Santiago De La Cruz Abrego Abrego', ['del','de','la'], ['married_last_name' => 'de']);
print_r($result);

$result = K7Text::split_name('María González', ['del','de','la'], ['married_last_name' => 'de']);
print_r($result);

$result = K7Text::split_name('Lucibeth Del Carmen De La Rosa Palacio de Paredes', ['del','de','la'], ['married_last_name' => 'de']);
print_r($result);

결과는 다음과 같습니다.


stdClass Object
(
    [first_name] => Edgardo
    [middle_name] => Hormelis
    [last_name] => Gomez
    [mother_last_name] => Gaitan
    [married_last_name] => 
)
stdClass Object
(
    [first_name] => Miguel
    [middle_name] => H.
    [last_name] => Pitty
    [mother_last_name] => De León
    [married_last_name] => 
)
stdClass Object
(
    [first_name] => Santiago
    [middle_name] => De La Cruz
    [last_name] => Abrego
    [mother_last_name] => Abrego
    [married_last_name] => 
)
stdClass Object
(
    [first_name] => María
    [middle_name] => 
    [last_name] => González
    [mother_last_name] => 
    [married_last_name] => 
)
stdClass Object
(
    [first_name] => Lucibeth
    [middle_name] => Del Carmen
    [last_name] => De La Rosa
    [mother_last_name] => Palacio
    [married_last_name] => Paredes
)

저는 이것을 사용합니다. 심지어 이름이 여러 개인 &amp; &amp; 등과 이름을 구분하기도 합니다.

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;
}

샘플 출력 Hanna and Mykhoylo Ilyashevych

Array

( [0] => 배열 ([이름] => 한나 [중명] => [성] => 일리야셰비치 )

[1] => Array
    (
        [firstname] => Mykhoylo
        [middlename] => 
        [lastname] => Ilyashevych
    )

)

여기에 전체 이름을 이름과 성으로 나누는 아주 간단한 방법이 있습니다.

$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

2개의 요소로 구성된 어레이를 얻는 데만도 많은 작업이 필요 없습니다.

function parse_name($full_name) {
        $parts = explode(" ", $full_name);

        if (count($parts) > 2) {
            $last = array_pop($parts);
            return [implode(" ", $parts), $last];
        }

        return [$parts[0], $parts[1]];
}

Ex 1parse_name("Johnny Deep");출력:

array(
  0 => "Johnny",
  1 => "Deep"
);

Ex 2parse_name("Lincoln Johnny Deep");출력:

array(
  0 => "Lincoln Johnny",
  1 => "Deep"
);

하나의 라인 코드는 다음과 같을 수 있습니다.

return (explode(" ", $yourName))[0];

많은 좋은 간단한 답들이,array_pop아이디어는 훌륭했지만, Jr, Sr, I, II 등의 성을 가진 성으로 비린내가 날 수 있습니다.

첫 번째 분할을 바탕으로 성과 성을 알려드리기 위해 이 핸들러를 생각해 냈습니다.다시 말하지만, 더 길거나 여러 개의 중간 이름과 관련하여 문제가 발생할 수 있지만, 이는 처음과 마지막 이름만을 위한 것입니다.

$name = 'john public jr';
dump(nameNormalize($name);
function nameNormalize($str)
    {
        $firstname = '';
        $lastname = '';
        $name = [];
        if (stripos($str, ',') === false) {
            $name = explode(' ', $str);
            if (! empty($name[0])) {
                $firstname = $name[0];
                unset($name[0]);
            }
        } else {
            $name = explode(', ', $str);
            if (! empty($name[1])) {
                $firstname = $name[1];
                unset($name[1]);
            }
        }
        $lastname = implode(' ', $name) ?? '';
        if (empty($firstname) && ! empty($lastname)) {
            $firstname = $lastname;
            $lastname = '';
        }

        return [
            'firstname' => $firstname,
            'lastname'  => $lastname,
        ];
    }

돌아와야 합니다.

array:2 [
  "firstname" => "john"
  "lastname" => "public jr"
]

도움이 되기를 바랍니다!

이것은 중간을 무시하고 첫 번째와 마지막을 얻을 것입니다.

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;
}

언급URL : https://stackoverflow.com/questions/13637145/split-text-string-into-first-and-last-name-in-php

반응형