Si j'avais:
$string = "PascalCase";
j'ai besoin
"pascal_case"
PHP propose-t-il une fonction à cet effet?
php
string
pascalcasing
snakecasing
openfrog
la source
la source
Réponses:
Essayez ceci pour la taille:
Production:
Cela met en œuvre les règles suivantes:
la source
Une solution plus courte: similaire à celle de l' éditeur avec une expression régulière simplifiée et corrigeant le problème du "trait de soulignement de fin":
Démo PHP | Démo Regex
Notez que les cas comme
SimpleXML
seront convertis ensimple_x_m_l
utilisant la solution ci-dessus. Cela peut également être considéré comme une mauvaise utilisation de la notation en cas de chameau (ce serait correctSimpleXml
) plutôt qu'un bogue de l'algorithme car de tels cas sont toujours ambigus - même en regroupant les caractères majuscules dans une chaîne (simple_xml
), cet algorithme échouera toujours dans les autres cas extrêmes commeXMLHTMLConverter
ou mots d' une lettre près abréviations, etc. Si vous ne me dérange pas sur les cas de bord (plutôt rare) et que vous souhaitez gérerSimpleXML
correctement, vous pouvez utiliser une solution peu plus complexe:Démo PHP | Démo Regex
la source
Une solution concise et peut gérer certains cas d'utilisation délicats:
Peut gérer tous ces cas:
Vous pouvez tester cette fonction ici: http://syframework.alwaysdata.net/decamelize
la source
Porté de Ruby
String#camelize
etString#decamelize
.Une astuce que les solutions ci-dessus ont pu manquer est le modificateur «e» qui permet
preg_replace
d'évaluer la chaîne de remplacement en tant que code PHP.la source
e
indicateur pourpreg_replace
est obsolète dans PHP 5.5.^|
oustrlen
.Le composant Symfony Serializer a un CamelCaseToSnakeCaseNameConverter qui a deux méthodes
normalize()
etdenormalize()
. Ceux-ci peuvent être utilisés comme suit:la source
$nameConverter->normalize('CamelCase')
sorties_camel_case
dans la version actuelle 3.2 du composant Symfony Serializer.La plupart des solutions ici semblent lourdes. Voici ce que j'utilise:
"CamelCASE" est converti en "camel_case"
lcfirst($camelCase)
abaissera le premier caractère (évite que la sortie convertie 'CamelCASE' commence par un trait de soulignement)[A-Z]
trouve les majuscules+
traitera chaque majuscule consécutive comme un mot (évite que 'CamelCASE' soit converti en camel_C_A_S_E)ThoseSPECCases
->those_spec_cases
au lieu dethose_speccases
strtolower([…])
transforme la sortie en minusculesla source
lcfirst
fonction à $ camelCaseucfirst()
appel.USADollarSymbol
devientu_sa_dollar_symbol
Demo Je ne recommande pas cette solution car elle doit faire deux passes dans la chaîne d'entrée avec regex - un signe d'un modèle non raffiné.php n'offre pas de fonction intégrée pour cet afaik, mais voici ce que j'utilise
le séparateur peut être spécifié dans l'appel de fonction, vous pouvez donc l'appeler comme ceci
la source
mb_strtolower
et l'/u
option activéepreg_replace
.Vous devez exécuter une expression régulière qui correspond à toutes les lettres majuscules sauf si elle est au début et la remplacer par un trait de soulignement plus cette lettre. Une solution utf-8 est la suivante:
Si vous n'êtes pas sûr de la casse de votre chaîne, mieux vaut la vérifier d'abord, car ce code suppose que l'entrée est à la
camelCase
place deunderscore_Case
oudash-Case
, donc si les derniers ont des lettres majuscules, il leur ajoutera des traits de soulignement.La réponse acceptée de cletus est beaucoup trop compliquée à mon humble avis et cela ne fonctionne qu'avec les caractères latins. Je trouve que c'est une très mauvaise solution et je me demande pourquoi elle a été acceptée. La conversion
TEST123String
entest123_string
n'est pas nécessairement une exigence valable. Je l'ai plutôt gardé simple et séparéABCccc
ena_b_cccc
au lieu deab_cccc
parce qu'il ne perd pas d'informations de cette façon et la conversion vers l'arrière donnera exactement la même chaîne avec laquelle nous avons commencé. Même si vous voulez le faire dans l'autre sens, il est relativement facile d'écrire une expression régulière pour elle avec un(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
regard en arrière positif ou deux expressions régulières sans regarder en arrière si vous n'êtes pas un expert en expression régulière. Il n'est pas nécessaire de le diviser en sous-chaînes sans parler du choix entrestrtolower
etlcfirst
où l'utilisationstrtolower
serait tout à fait correcte.la source
Si vous recherchez une version PHP 5.4 et une réponse ultérieure, voici le code:
la source
Pas du tout fantaisiste mais simple et rapide comme l'enfer:
la source
++$i
au lieu de$i++
le rendre un peu plus rapide aussi;)"CamelCase" à "camel_case":
ou:
la source
this-kind-of-output
Une version qui n'utilise pas regex peut être trouvée dans la source Alchitect :
la source
Voici donc un one-liner:
la source
g
modificateur à cette expression régulière.g
et cela fonctionne très bien pour moi.g
. Mais je ne me souviens pas de la phrase avec laquelle j'ai testé.danielstjules / Stringy fournit une méthode pour convertir une chaîne de camelcase en snakecase.
la source
Laravel 5.6 fournit un moyen très simple de le faire:
Ce qu'il fait: s'il voit qu'il y a au moins une lettre majuscule dans la chaîne donnée, il utilise une anticipation positive pour rechercher n'importe quel caractère (
.
) suivi d'une majuscule ((?=[A-Z])
). Il remplace ensuite le caractère trouvé par sa valeur suivie du séparateur_
.la source
Le port direct depuis les rails (moins leur traitement spécial pour :: ou les acronymes) serait
Connaissant PHP, ce sera plus rapide que l'analyse manuelle qui se produit dans d'autres réponses données ici. L'inconvénient est que vous ne pouvez pas choisir ce qu'il faut utiliser comme séparateur entre les mots, mais cela ne faisait pas partie de la question.
Vérifiez également le code source des rails pertinents
Notez que ceci est destiné à être utilisé avec les identificateurs ASCII. Si vous devez faire cela avec des caractères en dehors de la plage ASCII, utilisez le modificateur '/ u' pour
preg_match
et utilisezmb_strtolower
.la source
Voici ma contribution à une question de six ans avec Dieu sait combien de réponses ...
Il convertira tous les mots de la chaîne fournie qui sont dans camelcase en snakecase. Par exemple, "SuperSpecialAwesome et aussi FizBuzz καιΚάτιΑκόμα" seront convertis en "super_special_awesome et aussi fizz_buzz και_κάτι_ακόμα".
la source
Yii2 a la fonction différente pour créer le mot snake_case de CamelCase.
la source
Solution courte:
la source
J'ai eu un problème similaire mais je n'ai trouvé aucune réponse satisfaisant la conversion de CamelCase en snake_case, tout en évitant les traits de soulignement en double ou redondants
_
pour les noms avec des traits de soulignement ou les abréviations en majuscules.Le problème est le suivant:
La solution que j'ai écrite est un simple appel à deux fonctions, minuscules et rechercher et remplacer des lettres minuscules-majuscules consécutives:
la source
la source
$name{$k}
(ou$name[$k]
), ce qui allongerait votre code, mais évite la surcharge de le convertir vers et à partir d'un tableau.La pire réponse ici était si proche d'être la meilleure (utilisez un cadre). NON NE PAS, jetez un œil au code source. voir ce qu'un cadre bien établi utilise serait une approche beaucoup plus fiable (éprouvée et testée). Le framework Zend a quelques filtres de mots qui correspondent à vos besoins. Source .
voici quelques méthodes que j'ai adaptées de la source.
la source
Il existe une bibliothèque offrant cette fonctionnalité:
la source
Si vous utilisez le framework Laravel, vous pouvez utiliser uniquement la méthode snake_case () .
la source
C'est l'un des moyens les plus courts:
la source
Comment dé-caméliser sans utiliser regex:
Une modification:
Comment pourrais-je faire cela en 2019:
Et quand PHP 7.4 sortira:
la source
C'est facile d'utiliser les classes Filter des Zend Word Filters :
la source
La bibliothèque open source TurboCommons contient une méthode formatCase () à usage général dans la classe StringUtils, qui vous permet de convertir une chaîne en de nombreux formats de cas courants, tels que CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case, et bien d'autres.
https://github.com/edertone/TurboCommons
Pour l'utiliser, importez le fichier phar dans votre projet et:
la source
la source
SI vous pouviez commencer par:
Ensuite, vous pouvez convertir dans les deux cas simplement avec:
Ou tout autre cas:
la source