camelCase to dash - две заглавные буквы рядом друг с другом


Я использую эту функцию для преобразования camelCase в пунктирную строку:

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

Это вроде как работает, но есть проблема, когда у меня есть, например, эта строка: getADog. Он возвращает get-adog, но я хочу get-a-dog

Как я должен изменить свой код? Спасибо

Author: simPod, 2012-05-09

2 answers

Используйте утверждение с оглядкой:

function camel2dashed($className) {
    return strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $className));
}

Посмотрите, как он работает онлайн: ideone

 29
Author: Mark Byers, 2012-05-08 23:08:43

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

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

Это все равно не будет обрабатывать такие случаи, как "COMPANYHQ" @sfjedi -> "штаб-квартира компании". Для этого вам придется явно проверить наличие разрешенных подстрок с заглавной буквы, которые не следует разделять, или указать некоторые общие правила (например, не ставить дефис перед последним символом).

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

 6
Author: Ergwun, 2017-05-23 12:10:36