正则表达式将 String-Contained 缩写转换为标题大小写

Regex Convert String-Contained Abbreviations to Title Case

作为我正在扩展的简单 URL cleaning/slugging 函数的一部分,我需要进行如下转换:

Original               Converted
---------------------------------------------
USAMarch               UsaMarch
FETExaminations        FetExaminations      *
AnotherABBRString      AnotherAbbrString
LastONE                LastOne

(这些只是示例,第二个除外,这是让我首先这样做的原因。)

我假设我需要使用 preg_replace_callback 来确定任何缩写的位置并适当地区分大小写。

我不知道从哪里开始。有谁知道我可以做些什么来解决这个问题?

更新

好的,到目前为止我有这个:

$input = preg_replace_callback("~([A-Z])([A-Z]+)([^a-z])([a-z]|)~",
function ($captures) {
   return $captures[1].strtolower($captures[2]).$captures[3].$captures[4];
},
$input);

不幸的是,它不适用于缩写最后的字符串:

This                   Becomes
---------------------------------------------
LastONE                LastOnE

所以我假设我检查的 end 不正确。此外,此尝试不是递归的。我该怎么做?

这些适用于您的示例。

甚至可以找到独立的上限。

 # Find:  '/([A-Z])([A-Z]+)(?=[A-Z]|\b)/'
 # Replace:   . tolower()

 ( [A-Z] )                     # (1), Upper case
 ( [A-Z]+ )                    # (2), 1 or more upper case
 (?=                           # Lookahead assertion
      [A-Z]                         # Upper case
   |                              # or,
      \b                            # Word boundry
 )

或者,在可能的结束大写前需要小写

 # Find:  '/([a-z])?([A-Z])([A-Z]+)(?=[A-Z]|(?(1)\b|(?!)))/'
 # Replace:   . tolower()

 ( [a-z] )?                    # (1), optional lower case
 ( [A-Z] )                     # (2), Upper case
 ( [A-Z]+ )                    # (3), 1 or more upper case
 (?=                           # Lookahead assertion
      [A-Z]                         # Upper case
   |                              # or
      (?(1)                         # Conditional, does lower case precede this ?
           \b                            # yes, match boundry
        |  (?!)                          # or fail, this is a stand alone cap's
      )
 )