通过下/上

时间:2017-09-21 20:29:42

标签: php string uppercase lowercase

如何将firstname和surname与这样的字符串分开:

  

Pietro DE GIOVANNI

Pietro是姓,DE GIOVANNI姓氏

我曾经在空格上用explode()做这件事,但显然它不会对这样的人起作用。

提前致谢。

1 个答案:

答案 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'RILEYJohn-Paul JOHNSONJohn. 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旁边任何字符的名称,这将代表两个第一个问题。