使用 PHP 获取姓氏的 4 个字母的姓名首字母

Using PHP to get initials of names with 4 letters of last name

我有一小段代码用于输出一组姓名的首字母:

$names = array("Tom Hanks", "Julia Roberts");
    
    $initials = implode('/', array_map(function ($name) { 
        preg_match_all('/\b\w/', $name, $matches);
        return implode('', $matches[0]);
    }, $names));
    

    echo $initials ;

这输出 TH/JR。但我更喜欢 THank/JRobe ,其中使用姓氏的前 4 个字母。

实现该目标的最佳方法是什么?

只需使用字符串函数。这些适用于您显示的名称类型。这些显然不适用于 John Paul JonesJuan Carlos De Jesus 等,具体取决于您对他们的要求:

$initials = implode('/', array_map(function ($name) { 
    return $name[0] . substr(trim(strstr($name, ' ')), 0, 4);
}, $names));
  • $name[0]是第一个字符
  • strstr return space 以及 space、trim space
  • 之后的所有内容
  • substr return 最后 4 个字符

可选,explode 在 space 上:

$initials = implode('/', array_map(function ($name) { 
    $parts = explode(' ', $name);
    return $parts[0][0] . substr($parts[1], 0, 4);
}, $names));

对于preg_match

$initials = implode('/', array_map(function ($name) { 
    preg_match('/([^ ]) ([^ ]{4})/', $name, $matches);
    return $matches[1].$matches[2];
}, $names));
  • ([^ ]) 捕获不是 space
  • 匹配 space
  • ([^ ]{4}) 抓不到 space 4 次

假设名称由单词字符组成,给定示例的另一个选项可能是使用 preg_replace 并将字符串数组传递给它。

模式 ([A-Z])\w+\h+(\w{4})\w* 使用 2 个捕获组,其中第一组包含一个大写字符,第二组包含 4 个将用作替换的单词字符。

$names = array("Tom Hanks", "Julia Roberts");
echo implode('/', 
    preg_replace(
        "/([A-Z])\w+\h+(\w{4})\w*/",
        "",
        $names
    )
);

输出

THank/JRobe

Php demo

为了匹配 unicode 大写和小写字符,模式的一部分可能看起来像

"/(\p{Lu})\p{Ll}+\h+(\p{Lu}\p{Ll}{3})\p{L}*/u"