我在mysql数据库中有一个full_name
字段,我需要解析名字和姓氏,因为我现在正在将数据转移到first_name
和last_name
字段
所以名字是这样的;有些人有中间名,有些则没有:
James K. Dillon
Mark Holder
Tiffini lynn Jones
我发现php函数strtok可能会有所帮助,但有没有人有其他想法?
答案 0 :(得分:5)
嗯..识别名称可能相当困难,特别是如果用户容易出现拼写错误。
在100%的情况下可能不起作用的好方法(假设至少90%或者你所展示的所有少数例子)是将字符串分成数组并获取第一个和最后一个元素。
$name_parts = explode(' ', $name);
$first_name = $name_parts[0];
$last_name = $name_parts[sizeof($name_parts)-1];
我更喜欢使用explode
代替strtok
答案 1 :(得分:5)
简而言之,你已经注定了。
有些人只有名字和姓氏:John Smith
有些人有第一个,中间和最后一个:John Philip Smith
有些人有名字,但他们的姓氏由两部分组成:John Smith Parker
(是的,有些人不使用连字符)
有些文化将最后一个(即家庭)名称放在第一个:Kurosawa Akira
等...
答案 2 :(得分:2)
Jason Priem写了一篇优秀的Human Name Parser,其中包含各种复杂性和格式的名称,如:
并解析出:
答案 3 :(得分:1)
为什么不搜索空格数。
如果有一个空格,你知道它有两个名字,第一个/最后一个,如果有两个空格,你知道有3个名字,你可以用中间名做你想做的事,或者保留它并将它附加到其中一个其他
答案 4 :(得分:0)
另一种选择是使用分隔符空间''
来使用explode$name = "James K. Dillon"
$array = explode($name,' ');
// $array = {'James', 'K.', 'Dillon'}
编辑:我刚看到slandau回答,所以使用他的想法和我的想法:
$name = "James K. Dillon"
$array = explode($name,' ');
if (array_length($array) < 3){
// it hasn't got middle name
}
else{
// it has middle name
}
答案 5 :(得分:0)
好的,所以我在mysql db中有一个full_name字段
糟糕的主意。我们在我们的系统上有这个,这是一个噩梦,你怎么订购我姓氏的条目?如果您想要与任何其他系统进行互操作,则必须使用逻辑来猜测拆分,这将是不准确的。你最好至少拥有姓名和姓氏。
答案 6 :(得分:0)
使用explode(" ",$name)
然后从数组中获取第一个和最后一个索引。
答案 7 :(得分:0)
因为您将名称分配到first_name和last_name字段,我假设中间名(如果可用)应该在last_name字段中? 如果爆炸将起作用但需要限制为2,否则将遗漏last_name
<?php
$name="Peter L. Panda";
$temp=explode(" ",$name,2);
$firstname=$temp[0]; //==Peter
$lastname=$temp[1]; //==L. Panda
?>