PHP: Как преобразовать строку, содержащую символы верхнего регистра - PullRequest
3 голосов
/ 03 июля 2011

Я работаю над именами классов, и мне нужно проверить, есть ли какое-нибудь верхнее имя верблюда и сломать его следующим образом:

 "UserManagement" becomes "user-management"  

или

 "SiteContentManagement" becomes "site-content-management"

после обширногопоиск Я нашел только различное использование ucfirst, strtolower, strtoupper, ucword, и я не могу понять, как использовать их, чтобы удовлетворить мои потребности какие-либо идеи?

спасибо за чтение;)

Ответы [ 5 ]

5 голосов
/ 03 июля 2011

Вы можете использовать preg_replace для замены любого экземпляра строчной буквы, за которой следует заглавная буква, вашим вариантом с нижним тире-нижним тире:

$dashedName = preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className);

Затем следует strtolower(), чтобы позаботиться о любых оставшихся заглавных буквах:

return strtolower($dashedName);

Полная функция здесь:

function camel2dashed($className) {
  return strtolower(preg_replace('/([^A-Z-])([A-Z])/', '$1-$2', $className));
}

Для объяснения используемого регулярного выражения:

/        Opening delimiter
(        Start Capture Group 1
  [^A-Z-]   Character Class: Any character NOT an uppercase letter and not a dash
)        End Capture Group 1
(        Start Capture Group 2
  [A-Z]    Character Class: Any uppercase letter
)        End Capture Group 2
/        Closing delimiter

Что касается строки замены

$1  Insert Capture Group 1
-   Literal: dash
$2  Insert Capture Group 2
3 голосов
/ 03 июля 2011

Theres не встроенный способ сделать это.

Это будет ConvertThis в convert-this:

$str = preg_replace('/([a-z])([A-Z])/', '$1-$2', $str);
$str = strtolower($str);
2 голосов
/ 03 июля 2011

Вы можете использовать регулярные выражения, чтобы получить каждое слово, а затем добавить тире, как это:

preg_match_all ('/[A-Z][a-z]+/', $className, $matches); // get each camelCase words
$newName = strtolower(implode('-', $matches[0])); // add the dashes and lowercase the result
0 голосов
/ 06 мая 2019

Это просто делается без каких-либо групп захвата - просто найдите позицию нулевой ширины перед заглавной буквой (исключая первую букву строки), затем замените ее дефисом, затем вызовите strtolower для новой строки.

Код: ( Демо )

echo strtolower(preg_replace('~(?!^)(?=[A-Z])~', '-', $string));

Взгляд в будущее (?=...) соответствует, но не использует никаких символов.

0 голосов
/ 03 июля 2011

Лучшим способом сделать это может быть preg_replace с использованием шаблона, который заменяет заглавные буквы их строчными аналогами, добавляя перед ними знак "-".

Вы также можете просмотреть каждую букву и восстановить всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...