В рамках простой функции очистки / удаления 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);
К сожалению, однако, он не работает со строками, где аббревиатура является последней:
This Becomes
---------------------------------------------
LastONE LastOnE
Итак, я проверяю конец неправильно, я полагаю. Кроме того, эта попытка не является рекурсивной. Как бы я это сделал?
Они работают с вашими примерами.
Даже находит отдельно стоящие шапки.
# 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
)
)
Других решений пока нет …