Разбить фамилию и имя по нижнему / верхнему

Как я могу отделить имя и фамилию от строки следующим образом:

Пьетро де Джованни

(Pietro быть первым именем и DE GIOVANNI фамилия)

Я делал это с explode() на местах, но, очевидно, это не работает на такого человека.

Заранее спасибо.

0

Решение

Вы можете разбивать имена на пробелы, как и раньше, а затем зацикливать результат как отдельные части имени. Проверить с 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, который будет составлять две первые проблемы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]