正则表达式将 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
)
)
作为我正在扩展的简单 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
)
)