Regex Преобразование строковых сокращений в заглавный регистр

В рамках простой функции очистки / удаления 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

Итак, я проверяю конец неправильно, я полагаю. Кроме того, эта попытка не является рекурсивной. Как бы я это сделал?

0

Решение

Они работают с вашими примерами.

Даже находит отдельно стоящие шапки.

 # 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
)
)
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector