Я использую эту функцию для преобразования CamelCase в пунктирную строку:
function camel2dashed($className) { return strtolower(preg_replace('/([^AZ-])([AZ])/', '$1-$2', $className)); }
он вроде работает, но проблема theres, когда у меня есть для ex. эта строка: getADog
. Он возвращает get-adog
но я хочу get-a-dog
как мне изменить свой код? благодаря
Используйте утверждение lookahead :
function camel2dashed($className) { return strtolower(preg_replace('/([a-zA-Z])(?=[AZ])/', '$1-', $className)); }
Смотрите, как работает онлайн: ideone
Для этого вам не требуется утверждение lookahead, если вы знаете, что ваша строка не начинается с буквы верхнего регистра, вы можете просто вставить дефис перед каждым прописным буквами следующим образом:
function camel2dashed($className) { return strtolower(preg_replace('/([AZ])/', '-$1', $className)); }
Это все равно не будет обрабатывать такие случаи, как @ company's hq "companyhQ" -> "company-hq". Для этого вам нужно будет явно протестировать разрешенные заглавные подстроки, которые не должны быть разделены, или указать некоторые общие правила (например, не дописывать дефис перед последним символом).
Вы можете найти более сложные альтернативы в ответах на этот виртуальный дублированный вопрос .