2012-05-08 9 views
8

estoy usando esta función para convertir a CamelCase cadena discontinua:camelCase a dash - dos capitales lado de la otra

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

que algo funciona, pero theres un problema cuando tengo por ej. esta cadena: getADog. Devuelve get-adog pero quiero get-a-dog

¿cómo debo cambiar mi código? Gracias

+2

¿Has considerado si querías dos letras mayúsculas una al lado de la otra? Por ejemplo, ¿companyHQ para la sede de la empresa? No querrías compañía-h-q, ¿verdad? – jedmao

+0

en este caso tienes razón, pero no sucederá. gracias – simPod

+0

Esto no es camelCase. Es PascalCase por cierto. –

Respuesta

26

Utilice un lookahead assertion:

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

ver su funcionamiento en línea: ideone

6

Usted no necesita una afirmación de búsqueda hacia delante para hacer esto si sabe que la cadena no se inicia con una sección superior -case carta, sólo puede insertar un guión antes de cada letra mayúscula como esto:

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

esto todavía no manejará casos como @sfjedi "companyHQ" -> "empresa-hq". Para eso, debe probar explícitamente las subcadenas capitalizadas permitidas que no deben dividirse, o especificar algunas reglas genéricas (por ejemplo, no anteponer el guión antes del último carácter).

Puede encontrar algunas alternativas más sofisticadas en las respuestas a este virtual duplicate question.

Cuestiones relacionadas