如何将firstname和surname与这样的字符串分开:
Pietro DE GIOVANNI
(Pietro
是姓,DE GIOVANNI
姓氏
我曾经在空格上用explode()
做这件事,但显然它不会对这样的人起作用。
提前致谢。
答案 0 :(得分: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
值。
这是一个live demo,其中我删除了包含a-zA-Z
旁边任何字符的名称,这将代表两个第一个问题。