名だけがあるかどうかを確認する努力があるので、cballouの答えが好きです。探しに来る他の人のために機能を追加すると思いました。
正規表現を使用した単純な関数 (単語の文字とハイフン)
- 姓が単一の単語であると仮定します。
- ミドル ネームについては、すべてがファースト ネームにグループ化されるだけであるとは想定していません。
- ただし、「名」の結果で、最初と中間を取得するためにもう一度使用できます。
コードは次のとおりです。
// 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);
}
例 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('#'.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;
}
例 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;
、認識できない名前 (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