我正在开发一个私有(private)消息系统,该系统允许用户通过其全名来搜索用户,例如:“乔治华盛顿”。

我有两个名为$firstname$lastname的变量,搜索功能按相关性(向该人发送消息的次数)对结果进行排序。如何获得一个文本字段,将“George Washington”拆分为$firstname="George"$lastname="Washington"

最佳答案

我喜欢cballou's answer,因为我们会努力检查是否只有名字。我以为我可以为其他人添加我的功能。
简单功能,使用正则表达式(单词char和连字符)

  • 假设姓氏将是一个单词。
  • 不假设中间名,所有中间名都归为名字。
  • 您可以在“名字”结果上再次使用它来获得名字和中间名。

  • 这是代码:
    // uses regex that accepts any word character or hyphen in last name
    function split_name($name) {
        $name = trim($name);
        $last_name = (strpos($name, ' ') === false) ? '' : preg_replace('#.*\s([\w-]*)$#', '$1', $name);
        $first_name = trim( preg_replace('#'.preg_quote($last_name,'#').'#', '', $name ) );
        return array($first_name, $last_name);
    }
    
    示例1:split_name('Angeler')输出:
    array(
        0 => 'Angeler',
        1 => ''
    );
    
    示例2:split_name('Angeler Mcgee')输出:
    array(
        0 => 'Angeler',
        1 => 'Mcgee'
    );
    
    示例3:split_name('Angeler Sherlee Mcgee')输出:
    array(
        0 => 'Angeler Sherlee',
        1 => 'Mcgee'
    );
    
    要拆分名字和中间名,
    示例4:split_name('Angeler Sherlee')输出:
    array(
        0 => 'Angeler',
        1 => 'Sherlee'
    );
    

    另一个功能-也检测中间名
    后来,我决定最好自动找出中间名(如果适用),因此我编写了此函数。
    function split_name($name) {
        $parts = array();
    
        while ( strlen( trim($name)) > 0 ) {
            $name = trim($name);
            $string = preg_replace('#.*\s([\w-]*)$#', '$1', $name);
            $parts[] = $string;
            $name = trim( preg_replace('#'.preg_quote($string,'#').'#', '', $name ) );
        }
    
        if (empty($parts)) {
            return false;
        }
    
        $parts = array_reverse($parts);
        $name = array();
        $name['first_name'] = $parts[0];
        $name['middle_name'] = (isset($parts[2])) ? $parts[1] : '';
        $name['last_name'] = (isset($parts[2])) ? $parts[2] : ( isset($parts[1]) ? $parts[1] : '');
    
        return $name;
    }
    
    示例1:split_name('Angeler Sherlee Mcgee')输出:
    array(
        'first_name' => 'Angeler',
        'middle_name' => 'Sherlee',
        'last_name' => 'Mcgee'
    );
    
    示例2:split_name('Angeler Mcgee')输出:
    array(
        'first_name' => 'Angeler',
        'middle_name' => '',
        'last_name' => 'Mcgee'
    );
    

    另一种方式-Sans Regex
    决定添加另一种不使用正则表达式的方式。
    它还具有用于无法识别的名称的return false;(空,空字符串,太多词组无法推断)。
    <?php
    
    function split_name($string) {
        $arr = explode(' ', $string);
        $num = count($arr);
        $first_name = $middle_name = $last_name = null;
    
        if ($num == 2) {
            list($first_name, $last_name) = $arr;
        } else {
            list($first_name, $middle_name, $last_name) = $arr;
        }
    
        return (empty($first_name) || $num > 3) ? false : compact(
            'first_name', 'middle_name', 'last_name'
        );
    }
    
    var_dump(split_name('Angela Mcgee'));
    var_dump(split_name('Angela Bob Mcgee'));
    var_dump(split_name('Angela'));
    var_dump(split_name(''));
    var_dump(split_name(null));
    var_dump(split_name('Too Many Names In Here'));
    
    产出
    Array
    (
        [first_name] => Angela
        [middle_name] => NULL
        [last_name] => Mcgee
    )
    
    Array
    (
        [first_name] => Angela
        [middle_name] => Bob
        [last_name] => Mcgee
    )
    
    Array
    (
        [first_name] => Angela
        [middle_name] => NULL
        [last_name] => NULL
    )
    
    false
    
    false
    
    false
    

    09-17 09:18