解析php中的全名?

时间:2011-01-20 20:42:59

标签: php parsing

我在mysql数据库中有一个full_name字段,我需要解析名字和姓氏,因为我现在正在将数据转移到first_namelast_name字段

所以名字是这样的;有些人有中间名,有些则没有:

James K. Dillon
Mark Holder
Tiffini lynn Jones

我发现php函数strtok可能会有所帮助,但有没有人有其他想法?

8 个答案:

答案 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,其中包含各种复杂性和格式的名称,如:

  • 学家沃尔特·韦斯特曼
  • de la Cruz,Lupe
  • George Oscar“Gob”Bluth,Jr。

并解析出:

  • 领先的首字母(如“J. Walter Weatherman”中的“J.”)
  • 名字(或名字中的第一个名字,如'R. Crumb')
  • 昵称(如“George Oscar”Gob中的“Gob”“Bluth,Jr。”)
  • 中间名
  • 姓氏(包括“van der Sar”和“Ortega y Gasset”等复合名字)和
  • 后缀(如'Jr。')

答案 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
?>