Se eu tivesse:
$string = "PascalCase";
eu preciso
"pascal_case"
O PHP oferece uma função para esse propósito?
php
string
pascalcasing
snakecasing
rã aberta
fonte
fonte
Respostas:
Experimente para ver o tamanho:
Resultado:
Isso implementa as seguintes regras:
fonte
Uma solução mais curta: semelhante à do editor com uma expressão regular simplificada e corrigindo o problema do "sublinhado à direita":
PHP Demo | Regex Demo
Observe que casos como
SimpleXML
serão convertidos parasimple_x_m_l
usar a solução acima. Isso também pode ser considerado um uso incorreto da notação camel case (correto seriaSimpleXml
) ao invés de um bug do algoritmo, uma vez que tais casos são sempre ambíguos - mesmo agrupando caracteres maiúsculos em uma string (simple_xml
) tal algoritmo sempre falhará em outros casos extremos comoXMLHTMLConverter
ou palavras de uma letra perto de abreviações, etc. Se você não se importa com os casos extremos (bastante raros) e deseja manipularSimpleXML
corretamente, você pode usar uma solução um pouco mais complexa:PHP Demo | Regex Demo
fonte
Uma solução concisa e pode lidar com alguns casos de uso complicados:
Pode lidar com todos esses casos:
Você pode testar essa função aqui: http://syframework.alwaysdata.net/decamelize
fonte
Transferido do
String#camelize
e do RubyString#decamelize
.Um truque que as soluções acima podem ter falhado é o modificador 'e' que faz
preg_replace
com que a string de substituição seja avaliada como código PHP.fonte
e
flag parapreg_replace
está sendo descontinuada no PHP 5.5.^|
oustrlen
.O Symfony Serializer Component possui um CamelCaseToSnakeCaseNameConverter que possui dois métodos
normalize()
edenormalize()
. Eles podem ser usados da seguinte forma:fonte
$nameConverter->normalize('CamelCase')
saídas_camel_case
na versão 3.2 atual do Symfony Serializer Component.A maioria das soluções aqui parecem opressivas. Aqui está o que eu uso:
"CamelCASE" é convertido em "camel_case"
lcfirst($camelCase)
irá diminuir o primeiro caractere (evita que a saída convertida de 'CamelCASE' comece com um sublinhado)[A-Z]
encontra letras maiúsculas+
tratará todas as maiúsculas consecutivas como uma palavra (evita que 'CamelCASE' seja convertido para camel_C_A_S_E)ThoseSPECCases
-> emthose_spec_cases
vez dethose_speccases
strtolower([…])
transforma a saída em minúsculasfonte
lcfirst
função a $ camelCaseucfirst()
chamada.USADollarSymbol
torna-seu_sa_dollar_symbol
Demo . Não recomendo esta solução porque ela tem que fazer duas passagens pela string de entrada com regex - um sinal de um padrão não refinado.php não oferece uma função embutida para este afaik, mas aqui está o que eu uso
o divisor pode ser especificado na chamada de função, então você pode chamá-lo assim
fonte
mb_strtolower
e a/u
opção ativadapreg_replace
.Você precisa executar uma regex que corresponda a todas as letras maiúsculas, exceto se estiver no início e substituí-la por sublinhado mais essa letra. Uma solução utf-8 é esta:
Se você não tiver certeza de qual é o caso de sua string, é melhor verificar primeiro, porque este código assume que a entrada é em
camelCase
vez deunderscore_Case
oudash-Case
, então se os últimos tiverem letras maiúsculas, ele adicionará sublinhados a eles.A resposta aceita de cletus é imho muito complicada e funciona apenas com caracteres latinos. Acho que é uma solução realmente ruim e me pergunto por que foi aceita. A conversão
TEST123String
emtest123_string
não é necessariamente um requisito válido. Prefiro mantê-lo simples e separadoABCccc
em ema_b_cccc
vez deab_cccc
porque ele não perde informações dessa forma e a conversão para trás dará exatamente a mesma string com que começamos. Mesmo se você quiser fazer isso de outra maneira, é relativamente fácil escrever um regex para ele com lookbehind positivo(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
ou dois regexes sem lookbehind se você não for um especialista em regex. Não há necessidade de dividi-lo em substrings, para não mencionar decidir entrestrtolower
elcfirst
onde usarstrtolower
seria totalmente adequado.fonte
Se você está procurando uma versão do PHP 5.4 e uma resposta posterior, aqui está o código:
fonte
Nada sofisticado, mas simples e rápido como o inferno:
fonte
++$i
em vez de$i++
torná-lo um pouco mais rápido também;)"CamelCase" para "camel_case":
ou:
fonte
this-kind-of-output
Uma versão que não usa regex pode ser encontrada na fonte do Alchitect :
fonte
Então aqui está uma linha:
fonte
g
modificador a este regex.g
ele e funciona bem para mim.g
. Mas não consigo me lembrar da frase com a qual testei.danielstjules / Stringy fornece um método para converter string de camelcase em snakecase.
fonte
O Laravel 5.6 oferece uma maneira muito simples de fazer isso:
O que ele faz: se ele vê que há pelo menos uma letra maiúscula na string dada, ele usa um lookahead positivo para procurar qualquer caractere (
.
) seguido por uma letra maiúscula ((?=[A-Z])
). Em seguida, ele substitui o caractere encontrado por seu valor seguido pelo separador_
.fonte
A porta direta dos trilhos (sem o tratamento especial para :: ou acrônimos) seria
Conhecendo o PHP, isso será mais rápido do que a análise manual que está acontecendo em outras respostas fornecidas aqui. A desvantagem é que você não escolhe o que usar como separador entre as palavras, mas isso não fazia parte da pergunta.
Verifique também o código-fonte relevante do Rails
Observe que isso se destina ao uso com identificadores ASCII. Se você precisar fazer isso com caracteres fora do intervalo ASCII, use o modificador '/ u' para
preg_match
e usemb_strtolower
.fonte
Aqui está minha contribuição para uma pergunta de seis anos com sabe Deus quantas respostas ...
Ele irá converter todas as palavras na string fornecida que estão em caixa de camelo em caixa de serpente. Por exemplo, "SuperSpecialAwesome e também FizBuzz καιΚάτιΑκόμα" serão convertidos em "super_special_awesome e também fizz_buzz και_κάτι_ακόμα".
fonte
Yii2 tem uma função diferente para fazer a palavra snake_case do CamelCase.
fonte
Solução curta:
fonte
Tive um problema semelhante, mas não consegui encontrar nenhuma resposta que satisfizesse como converter CamelCase para snake_case, evitando sublinhados duplicados ou redundantes
_
para nomes com sublinhados ou abreviações todas em maiúsculas.O problema é o seguinte:
A solução que escrevi é uma simples chamada de duas funções, minúsculas e pesquisar e substituir por letras maiúsculas e minúsculas consecutivas:
fonte
fonte
$name{$k}
(ou$name[$k]
), o que tornaria seu código mais longo, mas evita a grande sobrecarga de convertê-lo de e para um array.A pior resposta aqui estava tão perto de ser a melhor (use uma estrutura). NÃO, NÃO, basta dar uma olhada no código-fonte. ver o que um framework bem estabelecido usa seria uma abordagem muito mais confiável (experimentada e testada). O framework Zend possui alguns filtros de palavras que atendem às suas necessidades. Fonte .
aqui estão alguns métodos que adaptei da fonte.
fonte
Existe uma biblioteca que fornece esta funcionalidade:
fonte
Se você usa o framework Laravel, você pode usar apenas o método snake_case () .
fonte
Esta é uma das maneiras mais curtas:
fonte
Como descamelizar sem usar regex:
Uma edição:
Como eu faria isso em 2019:
E quando o PHP 7.4 será lançado:
fonte
É fácil usar as classes Filter dos Filtros do Zend Word :
fonte
A biblioteca de código aberto TurboCommons contém um método formatCase () de propósito geral dentro da classe StringUtils, que permite converter uma string em vários formatos de caso comuns, como CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case e muitos mais.
https://github.com/edertone/TurboCommons
Para usá-lo, importe o arquivo phar para o seu projeto e:
fonte
fonte
SE você pudesse começar com:
Então você pode converter para qualquer caso apenas com:
Ou qualquer outro caso:
fonte