парсинг полного имени в php? - PullRequest
1 голос
/ 20 января 2011

У меня есть поле full_name в базе данных mysql, и мне нужно разобрать имя и фамилию, потому что я сейчас передаю данные в поля first_name и last_name

Итак, имена такие; некоторые имеют отчество, а некоторые нет:

James K. Dillon
Mark Holder
Tiffini lynn Jones

Я нашел функцию php strtok , которая может помочь, но у кого-нибудь есть другие идеи?

Ответы [ 8 ]

5 голосов
/ 20 января 2011

Короче говоря, вы почти обречены.

У некоторых людей есть только имя и фамилия: John Smith

У некоторых есть имя, отчество и фамилия: John Philip Smith

У некоторых есть имя, но их фамилия состоит из двух частей: John Smith Parker (и да, некоторые люди для этого не используют дефис)

В некоторых культурах фамилия (то есть семья)) имя перед первым: Kurosawa Akira

и т. д. *

5 голосов
/ 20 января 2011

Ну что ж ... идентификация имен может быть довольно сложной, особенно если пользователи склонны к опечаткам.

Хороший подход, который может не сработать в 100% случаев (скажем, по крайней мере, 90% или для всехнесколько примеров, которые вы показали) - это разделить строку на массив и получить первый и последний элемент.

$name_parts = explode(' ', $name);
$first_name = $name_parts[0];
$last_name = $name_parts[sizeof($name_parts)-1];

Я предпочел использовать explode вместо strtok

2 голосов
/ 22 марта 2012

Джейсон Прием написал превосходный анализатор имен людей , который принимает имена различных сложностей и форматов, таких как:

  • J. Вальтер Метеоролог
  • де ла Круз, Лупе
  • Джордж Оскар «Гоб» Блут-младший

и анализирует:

  • ведущий инициал (как «J.» в «J. Walter Weatherman»)
  • имя (или первое имя в имени, подобном ‘R. Crumb’)
  • псевдонимы (например, «Гоб» в «Джорджа Оскара« Гоб »Блут, младший»)
  • отчество
  • фамилия (включая составные, такие как «van der Sar» и «Ortega y Gasset») и
  • суффикс (например, "Jr.")
1 голос
/ 20 января 2011

Почему вы не ищете количество пробелов.

Если есть один пробел, вы знаете, что это два имени, первое / последнее, если два пробела, вы знаете, что есть 3 имени, и вы можете делать то, что хотите, со вторым именем или оставить его и прикрепить к одному др.

0 голосов
/ 20 января 2011

, так как вы делите имя на поля first_name и last_name, я предполагаю, что второе имя, если оно доступно, должно быть в поле last_name? в этом случае explode будет работать, но потребуется ограничение 2, иначе last_name будет пропущено

<?php
$name="Peter L. Panda";

$temp=explode(" ",$name,2);
$firstname=$temp[0]; //==Peter
$lastname=$temp[1]; //==L. Panda
?>
0 голосов
/ 20 января 2011

Используйте explode(" ",$name), а затем возьмите первый и последний индексы из массива.

0 голосов
/ 20 января 2011

хорошо, поэтому у меня есть поле full_name в базе данных mysql

Плохая идея. У нас есть это в наших системах, и это кошмар, как вы собираетесь заказать записи моей фамилии? Если вы когда-нибудь захотите взаимодействовать с любой другой системой, вам придется использовать логику, чтобы угадать раскол, и это будет неточно. Вам гораздо лучше иметь хотя бы поля имени и фамилии.

0 голосов
/ 20 января 2011

Другой вариант - использовать взорвать , используя пробел ''

$name = "James K. Dillon"
$array = explode($name,' ');

// $array = {'James', 'K.', 'Dillon'}

Редактировать: Я только что увидел ответ Сландау, поэтому использую его идею и мою:

$name = "James K. Dillon"
$array = explode($name,' ');
if (array_length($array) < 3){
   // it hasn't got middle name
}
else{
   // it has middle name
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...