大写姓氏,不包括姓氏的小写前缀部分

Jim*_*nks 13 php utf-8

我正在尝试确定一个大写姓氏的方法; 但是,不包括小写前缀.

名称及其转换的示例:

  • 麦克阿瑟 - > MacARTHUR
  • McDavid - > McDAVID
  • LeBlanc - > LeBLANC
  • 麦金太尔 - > McINTYRE
  • de Wit - > de WIT

还有一些名称包含需要完全大写的姓氏,因此识别前缀的简单函数是strchr()不够的:

  • Macmaster - > MACMASTER
  • Macintosh - > MACINTOSH

PHP函数mb_strtoupper()不合适,因为它将整个字符串大写.同样strtoupper()是不合适的,并且在重音名称上也会失去重音.

围绕SO有一些答案可以部分回答这个问题,例如:使用PHP进行资本化 然而,常见的不足是假设所有姓氏为姓名的人Mac都跟随资本.

名称在数据库中正确地大写,因此我们可以假设拼写为Macarthur的名称是正确的,或者麦克阿瑟对另一个人是正确的.

dec*_*eze 8

遵守规则以最后一个大写字母后大写所有内容:

preg_replace_callback('/\p{Lu}\p{Ll}+$/u', 
                      function ($m) { return mb_strtoupper($m[0]); },
                      $name)
Run Code Online (Sandbox Code Playgroud)

\p{Lu}并且\p{Ll}分别是Unicode大写和小写字符,并且mb_strtoupper是unicode感知...对于一个简单的ASCII-only变体,这也会这样做:

preg_replace_callback('/[A-Z][a-z]+$/', 
                      function ($m) { return strtoupper($m[0]); },
                      $name)
Run Code Online (Sandbox Code Playgroud)