我正在开发一个私人消息系统,允许用户按全名搜索用户,例如:“乔治华盛顿”。
我有两个名为 $firstname
和 $lastname
的变量,搜索功能按相关性排序结果(您向该人发送了多少次消息)。如何获得一个文本字段以将“乔治华盛顿”拆分为 $firstname="George"
和 $lastname="Washington"
?
原文由 centree 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在开发一个私人消息系统,允许用户按全名搜索用户,例如:“乔治华盛顿”。
我有两个名为 $firstname
和 $lastname
的变量,搜索功能按相关性排序结果(您向该人发送了多少次消息)。如何获得一个文本字段以将“乔治华盛顿”拆分为 $firstname="George"
和 $lastname="Washington"
?
原文由 centree 发布,翻译遵循 CC BY-SA 4.0 许可协议
此功能适用于西班牙语名称,包括:名字、中间名、姓氏、母亲的姓氏和已婚姓氏(仅适用于女性)。这种名称格式在拉丁美洲非常普遍。
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
)
原文由 Ezequiel Villarreal 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答676 阅读✓ 已解决
2 回答608 阅读✓ 已解决
我喜欢 cballou 的回答,因为努力检查是否只有名字。我想我会为其他来找我的人添加我的功能。
简单函数,使用正则表达式(单词字符和连字符)
这是代码:
例 1:
split_name('Angeler')
输出:例 2:
split_name('Angeler Mcgee')
输出:例 3:
split_name('Angeler Sherlee Mcgee')
输出:要拆分名字和中间名,
例 4:
split_name('Angeler Sherlee')
输出:另一个功能 - 也检测中间名
后来我决定如果可以的话,自动计算出中间名会很好,所以我写了这个函数。
例 1:
split_name('Angeler Sherlee Mcgee')
输出:例 2:
split_name('Angeler Mcgee')
输出:另一种方式 - 无正则表达式
决定添加另一种不使用正则表达式的方式。
它还具有
return false;
用于不可识别的名称(null、空字符串、太多词组无法推断)。输出