正则表达式将包含字符串的缩写转换为标题案例

时间:2015-01-05 17:51:49

标签: php regex callback

作为我正在扩展的简单URL清理/阻塞功能的一部分,我需要进行如下转换:

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);

不幸的是,它不适用于缩写为last的字符串:

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

所以我假设错误地检查 end 。此外,这种尝试不是递归的。我该怎么做?

1 个答案:

答案 0 :(得分:1)

这些适用于您的示例。

甚至找到独立的帽子。

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

 ( [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:  $1$2 . tolower($3)

 ( [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
      )
 )