使用 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 Jones 或 Juan 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
为了匹配 unicode 大写和小写字符,模式的一部分可能看起来像
"/(\p{Lu})\p{Ll}+\h+(\p{Lu}\p{Ll}{3})\p{L}*/u"
我有一小段代码用于输出一组姓名的首字母:
$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 Jones 或 Juan 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
为了匹配 unicode 大写和小写字符,模式的一部分可能看起来像
"/(\p{Lu})\p{Ll}+\h+(\p{Lu}\p{Ll}{3})\p{L}*/u"