Si tuviera:
$string = "PascalCase";
Necesito
"pascal_case"
¿PHP ofrece una función para este propósito?
php
string
pascalcasing
snakecasing
rana abierta
fuente
fuente
Respuestas:
Pruébate esto para ver el tamaño:
Salida:
Esto implementa las siguientes reglas:
fuente
Una solución más corta: similar a la del editor con una expresión regular simplificada y solucionando el problema de "guión bajo al final":
Demostración de PHP | Demostración de expresiones regulares
Tenga en cuenta que los casos como
SimpleXML
se convertirán parasimple_x_m_l
usar la solución anterior. Eso también puede considerarse un uso incorrecto de la notación de mayúsculas y minúsculas (lo correcto seríaSimpleXml
) en lugar de un error del algoritmo, ya que tales casos son siempre ambiguos, incluso al agrupar caracteres en mayúscula en una cadena (simple_xml
), dicho algoritmo siempre fallará en otros casos de borde. me gustaXMLHTMLConverter
o palabras de una letra cerca de abreviaturas, etc. Si no le importan los casos extremos (bastante raros) y desea manejarlosSimpleXML
correctamente, puede usar una solución un poco más compleja:Demostración de PHP | Demostración de expresiones regulares
fuente
Una solución concisa que puede manejar algunos casos de uso complicados:
Puede manejar todos estos casos:
Puede probar esta función aquí: http://syframework.alwaysdata.net/decamelize
fuente
Portado de Ruby's
String#camelize
yString#decamelize
.Un truco que las soluciones anteriores pueden haber pasado por alto es el modificador 'e' que hace
preg_replace
que se evalúe la cadena de reemplazo como código PHP.fuente
e
bandera parapreg_replace
está en desuso en PHP 5.5.^|
ostrlen
.El componente de serializador de Symfony tiene un CamelCaseToSnakeCaseNameConverter que tiene dos métodos
normalize()
ydenormalize()
. Estos se pueden utilizar de la siguiente manera:fuente
$nameConverter->normalize('CamelCase')
salidas_camel_case
en la versión 3.2 actual del componente de serializador de Symfony.La mayoría de las soluciones aquí se sienten torpes. Esto es lo que uso:
"CamelCASE" se convierte en "camel_case"
lcfirst($camelCase)
bajará el primer carácter (evita que la salida convertida 'CamelCASE' comience con un guión bajo)[A-Z]
encuentra letras mayúsculas+
tratará cada mayúscula consecutiva como una palabra (evita que 'CamelCASE' se convierta en camel_C_A_S_E)ThoseSPECCases
-> enthose_spec_cases
lugar dethose_speccases
strtolower([…])
convierte la salida en minúsculasfuente
lcfirst
función a $ camelCaseucfirst()
llamada.USADollarSymbol
se convierte enu_sa_dollar_symbol
demostración No recomiendo esta solución porque tiene que hacer dos pasadas a través de la cadena de entrada con expresiones regulares, un signo de un patrón sin refinar.php no ofrece una función incorporada para este afaik, pero esto es lo que uso
el divisor se puede especificar en la llamada a la función, por lo que puede llamarlo así
fuente
mb_strtolower
y la/u
opción activadapreg_replace
.Debe ejecutar una expresión regular que coincida con todas las letras mayúsculas, excepto si está al principio, y reemplazarla con un subrayado más esa letra. Una solución utf-8 es esta:
Si no está seguro de qué caso es su cadena, es mejor verificarla primero, porque este código asume que la entrada es en
camelCase
lugar deunderscore_Case
odash-Case
, por lo que si las últimas tienen letras mayúsculas, les agregará guiones bajos.La respuesta aceptada de cletus es demasiado complicada en mi humilde opinión y funciona solo con caracteres latinos. Me parece una solución realmente mala y me pregunto por qué fue aceptada. Convertir
TEST123String
entest123_string
no es necesariamente un requisito válido. Preferí mantenerlo simple y separadoABCccc
ena_b_cccc
lugar deab_cccc
porque no pierde información de esta manera y la conversión hacia atrás dará exactamente la misma cadena con la que comenzamos. Incluso si desea hacerlo de la otra manera, es relativamente fácil escribir una expresión regular con una mirada atrás positiva(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
o dos expresiones regulares sin mirar atrás si no es un experto en expresiones regulares. No hay necesidad de dividirlo en subcadenas sin mencionar decidir entrestrtolower
ylcfirst
dónde usarlostrtolower
estaría completamente bien.fuente
Si está buscando una versión de PHP 5.4 y una respuesta posterior, aquí está el código:
fuente
No es nada sofisticado, pero es simple y rápido como el infierno:
fuente
++$i
en lugar de$i++
lo haría un poco más rápido también;)"CamelCase" a "camel_case":
o:
fuente
this-kind-of-output
Se puede encontrar una versión que no usa expresiones regulares en la fuente de Alchitect :
fuente
Así que aquí hay una sola línea:
fuente
g
modificador a esta expresión regular.g
él y funciona bien para mí.g
. Pero no recuerdo la frase con la que probé.danielstjules / Stringy proporciona un método para convertir cadenas de camelcase a snakecase.
fuente
Laravel 5.6 proporciona una forma muy sencilla de hacer esto:
Qué hace: si ve que hay al menos una letra mayúscula en la cadena dada, usa una búsqueda anticipada positiva para buscar cualquier carácter (
.
) seguido de una letra mayúscula ((?=[A-Z])
). Luego reemplaza el carácter encontrado con su valor seguido por el separador_
.fuente
El puerto directo desde rieles (menos su manejo especial para :: o siglas) sería
Conociendo PHP, esto será más rápido que el análisis manual que está sucediendo en otras respuestas dadas aquí. La desventaja es que no puedes elegir qué usar como separador entre palabras, pero eso no era parte de la pregunta.
También verifique el código fuente de rieles relevante
Tenga en cuenta que está diseñado para su uso con identificadores ASCII. Si necesita hacer esto con caracteres fuera del rango ASCII, use el modificador '/ u' para
preg_match
y usemb_strtolower
.fuente
Aquí está mi contribución a una pregunta de seis años con Dios sabe cuántas respuestas ...
Convertirá todas las palabras en la cadena proporcionada que están en camelcase a snakecase. Por ejemplo, "SuperSpecialAwesome y también FizBuzz καιΚάτιΑκόμα" se convertirán en "super_special_awesome y también fizz_buzz και_κάτι_ακόμα".
fuente
Yii2 tiene la función diferente para hacer la palabra snake_case de CamelCase.
fuente
Solución corta:
fuente
Tuve un problema similar, pero no pude encontrar ninguna respuesta que satisfaga cómo convertir CamelCase a snake_case, evitando al mismo tiempo guiones bajos duplicados o redundantes
_
para nombres con guiones bajos o abreviaturas en mayúsculas.El problema es el siguiente:
La solución que escribí es una simple llamada de dos funciones, minúsculas y buscar y reemplazar por letras minúsculas y mayúsculas consecutivas:
fuente
fuente
$name{$k}
(o$name[$k]
), lo que alargaría su código, pero evita la gran sobrecarga de convertirlo hacia y desde una matriz.La peor respuesta aquí estuvo muy cerca de ser la mejor (use un marco). NO NO, simplemente eche un vistazo al código fuente. ver lo que utiliza un marco bien establecido sería un enfoque mucho más confiable (probado y comprobado). El marco Zend tiene algunos filtros de palabras que se adaptan a sus necesidades. Fuente .
aquí hay un par de métodos que adapté de la fuente.
fuente
Hay una biblioteca que proporciona esta funcionalidad:
fuente
Si usa el framework Laravel, puede usar solo el método snake_case () .
fuente
Esta es una de las formas más cortas:
fuente
Cómo des-camelizar sin usar expresiones regulares:
Una edición:
¿Cómo haría eso en 2019?
Y cuándo se lanzará PHP 7.4:
fuente
Es fácil usar las clases de filtro de los filtros Zend Word :
fuente
La biblioteca TurboCommons de código abierto contiene un método formatCase () de propósito general dentro de la clase StringUtils, que le permite convertir una cadena a muchos formatos de casos comunes, como CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case y muchos más.
https://github.com/edertone/TurboCommons
Para usarlo, importe el archivo phar a su proyecto y:
fuente
fuente
SI pudieras comenzar con:
Entonces podrías convertir a cualquier caso solo con:
O cualquier otro caso:
fuente