【问题标题】:Using PHP to get initials of names with 4 letters of last name使用PHP获取姓氏4个字母的姓名首字母
【发布时间】:2021-01-12 20:17:27
【问题描述】:

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

$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 个字母。

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

【问题讨论】:

    标签: php preg-match-all implode array-map


    【解决方案1】:

    只需使用字符串函数。这些适用于您显示的名称类型。这些显然不适用于 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返回空格和空格后的所有内容,trim空格
    • substr 返回最后 4 个字符

    可选地,explode 在空间上:

    $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));
    
    • ([^ ]) 捕获不是空格
    • 匹配空格
    • ([^ ]{4}) 捕获非空格 4 次

    【讨论】:

      【解决方案2】:

      假设名称由单词字符组成,给出示例的另一个选项可能是使用 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*/",
              "$1$2",
              $names
          )
      );
      

      输出

      THank/JRobe
      

      Php demo

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

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

      【讨论】:

      • 太棒了,我没想过更换。比匹配和构建要好得多。
      • @AbraCadaver 我认为有多种方法可以解决这个问题,由于名称匹配,每种方法都有自己的脆弱性:-) 请给我点赞 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多