2012-05-08 2 views
8

J'utilise cette fonction pour convertir CamelCase en chaîne en pointillés:camelCase au tableau de bord - deux capitales à côté de l'autre

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

il fonctionne un peu, mais theres problème quand j'ai pour ex. cette chaîne: getADog. Il renvoie get-adog mais je veux get-a-dog

comment changer mon code? Merci

+2

Avez-vous considéré si vous vouliez deux lettres majuscules l'une à côté de l'autre? Par exemple, companyHQ pour le siège de l'entreprise? Vous ne voudriez pas de compagnie-h-q, non? – jedmao

+0

dans ce cas vous avez raison mais cela n'arrivera pas. merci – simPod

+0

Ce n'est pas camelCase. C'est PascalCase btw. –

Répondre

26

Utilisez un lookahead assertion:

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

voir travailler en ligne: ideone

6

Vous n'avez pas besoin d'une assertion avant de le faire si vous savez que votre chaîne ne démarre pas avec une partie supérieure lettre -cas, vous pouvez simplement insérer un trait d'union avant chaque lettre majuscule comme ceci:

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

ce encore ne traitera pas des cas comme @sfjedi "companyHQ" -> "company-hq". Pour cela, vous devez tester explicitement les sous-chaînes majuscules autorisées qui ne doivent pas être fractionnées, ou spécifier certaines règles génériques (par exemple ne pas préfixer le trait d'union avant le dernier caractère). Vous pouvez trouver des alternatives plus sophistiquées dans les réponses à cette virtual duplicate question.

Questions connexes