텍스트 문자열을 $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));
}
산출량
나는 이 제안을 본 적이 없습니다.
저 같은 경우에는 이름이 몇 개인지와 상관없이 이름을 처음과 끝 두 개의 분야로 나누어야 했습니다.그래서 저는 다음과 같이 했습니다.
$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
)
저는 이것을 사용합니다. 심지어 이름이 여러 개인 & & 등과 이름을 구분하기도 합니다.
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;
}
샘플 출력 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
'programing' 카테고리의 다른 글
log2가 내 수학에서 발견되지않았습니까? (0) | 2023.10.10 |
---|---|
동적으로 작성된 필드에서 JQuery Datepicker 사용 (0) | 2023.10.10 |
체크아웃 시 WooCommerce 문자 발송 변경 방법 (0) | 2023.10.10 |
PowerShell에서 일반 정적 메서드 호출 (0) | 2023.10.10 |
POSIX C API 기능 목록은 어디에 있습니까? (0) | 2023.10.10 |