2012-05-08 9 views
8

sto usando questa funzione per convertire CamelCase a stringa tratteggiata:camelCase a Dash - due capitali accanto all'altra

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

funziona un pò ma c'è problema quando ho per es. questa stringa: getADog. Restituisce get-adog ma voglio get-a-dog

come devo cambiare il mio codice? Grazie

+2

Hai considerato se volevi due maiuscole l'una accanto all'altra? Ad esempio, companyHQ per la sede centrale dell'azienda? Non vorresti compagnia-h-q, giusto? – jedmao

+0

in questo caso hai ragione ma non succederà. grazie – simPod

+0

Questo non è CamelCase. È PascalCase btw. –

risposta

26

Utilizzare un lookahead assertion:

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

vederlo lavorare on-line: ideone

6

Non hai bisogno di un'asserzione che guarda avanti per fare questo, se si sa che la stringa non inizia con un superiore lettera -case, si può semplicemente inserire un trattino prima di ogni lettera maiuscola in questo modo:

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

questo ancora non in grado di gestire casi come @sfjedi "companyHQ" -> "company-hq". Per fare ciò, devi testare esplicitamente le sottostringhe in maiuscole consentite che non devono essere suddivise, o specificare alcune regole generiche (ad esempio non anteporre il trattino prima dell'ultimo carattere).

È possibile trovare alcune alternative più sofisticate nelle risposte a questo virtual duplicate question.

Problemi correlati