Как я могу отделить имя и фамилию от строки следующим образом:
Пьетро де Джованни
(Pietro
быть первым именем и DE GIOVANNI
фамилия)
Я делал это с explode()
на местах, но, очевидно, это не работает на такого человека.
Заранее спасибо.
Вы можете разбивать имена на пробелы, как и раньше, а затем зацикливать результат как отдельные части имени. Проверить с ctype_upper()
если строка является чисто заглавной или нет, и добавьте ее к соответствующей переменной.
Поместив его в функцию, он может выглядеть так
function split_name($fullname) {
$firstname = "";
$surname = "";
$pieces = explode(" ", $fullname);
foreach ($pieces as $name) {
if (ctype_upper($name))
$surname .= $name." ";
else
$firstname .= $name. " ";
}
return array("firstname" => $firstname, "surname" => $surname);
}
Вы можете использовать его как таковой
$name = "Pietro DE GIOVANNI";
$split = split_name($name);
echo "Firstname: ".$split['firstname']."\nSurname: ".$split['surname'];
Заметка
Это не работает для таких имен, как James O'RILEY
, John-Paul JOHNSON
или же John. F. KENNEDY
, Первые два мы можем обойти, удалив любые символы, которые не a-zA-Z
перед сравнением с ctype_upper()
, но последнее мы не сможем различить, если это имя или фамилия — недостаточно данных, чтобы сказать в любом случае. Вы можете предполагать что это всегда часть имени (например), и / или проверьте, происходит ли это после того, как мы начали искать фамилии (если имя заглавными буквами было найдено). Вы можете позаботиться о первых двух случаях, проверив
if (ctype_upper(filter_var(str_replace("'", "", $name), FILTER_SANITIZE_STRING)))
вместо использования if
Заявление в оригинальном кодовом блоке. Это удаляет кавычки и любыеa-zA-Z
ценности.
Вот живое демо где я убрал имена, которые содержат любые символы, кроме a-zA-Z
, который будет составлять две первые проблемы.
Других решений пока нет …