作为我正在扩展的简单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 。此外,这种尝试不是递归的。我该怎么做?
答案 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
)
)