Hätte ich:
$string = "PascalCase";
Ich brauche
"pascal_case"
Bietet PHP eine Funktion für diesen Zweck?
php
string
pascalcasing
snakecasing
offener Frosch
quelle
quelle
Antworten:
Probieren Sie dies für die Größe an:
Ausgabe:
Dies implementiert die folgenden Regeln:
quelle
Eine kürzere Lösung: Ähnlich wie beim Editor mit einem vereinfachten regulären Ausdruck und der Behebung des Problems des "nachgestellten Unterstrichs":
PHP Demo | Regex Demo
Beachten Sie, dass Fälle wie
SimpleXML
diesimple_x_m_l
Verwendung der obigen Lösung konvertiert werden. Dies kann auch als falsche Verwendung der Kamelschreibweise (richtig wäreSimpleXml
) und nicht als Fehler des Algorithmus angesehen werden, da solche Fälle immer mehrdeutig sind - selbst wenn Gruppen in Großbuchstaben zu einer Zeichenfolge gruppiert werden (simple_xml
), schlägt ein solcher Algorithmus in anderen Randfällen immer fehl Like-XMLHTMLConverter
oder Ein-Buchstaben-Wörter in der Nähe von Abkürzungen usw. Wenn Sie sich nicht für die (eher seltenen) Randfälle interessieren undSimpleXML
richtig damit umgehen möchten, können Sie eine etwas komplexere Lösung verwenden:PHP Demo | Regex Demo
quelle
Eine prägnante Lösung, die einige knifflige Anwendungsfälle bewältigen kann:
Kann alle diese Fälle behandeln:
Sie können diese Funktion hier testen: http://syframework.alwaysdata.net/decamelize
quelle
Portiert von Ruby's
String#camelize
undString#decamelize
.Ein Trick, den die oben genannten Lösungen möglicherweise übersehen haben, ist der Modifikator 'e', der dazu führt
preg_replace
, dass die Ersatzzeichenfolge als PHP-Code ausgewertet wird.quelle
e
Flag fürpreg_replace
wird in PHP 5.5 veraltet.^|
oder nichtstrlen
.Die Symfony Serializer-Komponente verfügt über einen CamelCaseToSnakeCaseNameConverter mit zwei Methoden
normalize()
unddenormalize()
. Diese können wie folgt verwendet werden:quelle
$nameConverter->normalize('CamelCase')
Ausgaben_camel_case
in der aktuellen Version 3.2 der Symfony Serializer-Komponente.Die meisten Lösungen hier fühlen sich schwerfällig an. Folgendes verwende ich:
"CamelCASE" wird in "camel_case" konvertiert
lcfirst($camelCase)
verringert das erste Zeichen (vermeidet die konvertierte Ausgabe von 'CamelCASE', um mit einem Unterstrich zu beginnen)[A-Z]
findet Großbuchstaben+
behandelt jeden aufeinanderfolgenden Großbuchstaben als Wort (verhindert, dass 'CamelCASE' in camel_C_A_S_E konvertiert wird)ThoseSPECCases
->those_spec_cases
stattthose_speccases
strtolower([…])
Schaltet die Ausgabe in Kleinbuchstaben umquelle
lcfirst
Funktion $ Camelcaseucfirst()
Aufrufs unerwartet aufgeteilt .USADollarSymbol
wirdu_sa_dollar_symbol
Demo Ich empfehle diese Lösung nicht, da sie zwei Durchgänge mit Regex durch die Eingabezeichenfolge machen muss - ein Zeichen für ein nicht verfeinertes Muster.PHP bietet keine eingebaute Funktion für diesen Afaik, aber hier ist, was ich benutze
Der Splitter kann im Funktionsaufruf angegeben werden, so dass Sie ihn so aufrufen können
quelle
mb_strtolower
und die/u
Option aktivierenpreg_replace
.Sie müssen einen regulären Ausdruck durchlaufen, der mit jedem Großbuchstaben übereinstimmt, außer wenn er am Anfang steht, und ihn durch einen Unterstrich plus diesen Buchstaben ersetzen. Eine utf-8-Lösung ist folgende:
Wenn Sie sich nicht sicher sind, in welchem Fall sich Ihre Zeichenfolge befindet, überprüfen Sie sie besser zuerst, da dieser Code davon ausgeht, dass die Eingabe
camelCase
anstelle vonunderscore_Case
oder erfolgtdash-Case
erfolgt. Wenn die letzteren also Großbuchstaben enthalten, werden ihnen Unterstriche hinzugefügt.Die akzeptierte Antwort von Cletus ist imho viel zu kompliziert und funktioniert nur mit lateinischen Zeichen. Ich finde es eine wirklich schlechte Lösung und frage mich, warum es überhaupt akzeptiert wurde. Die Konvertierung
TEST123String
intest123_string
ist nicht unbedingt eine gültige Voraussetzung. Ich eher hielt es einfach und getrenntABCccc
ina_b_cccc
statt ,ab_cccc
weil es nicht verlieren Informationen auf diese Weise und die Rückkonvertierung wird genau die gleiche Zeichenfolge wir begannen mit geben. Selbst wenn Sie es anders machen möchten, ist es relativ einfach, eine Regex mit positivem Lookbehind(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
oder zwei Regexes ohne Lookbehind zu schreiben, wenn Sie kein Regex-Experte sind. Es besteht keine Notwendigkeit, es in Teilzeichenfolgen aufzuteilen, ganz zu schweigen von der Entscheidung, zwischenstrtolower
undlcfirst
wo die Verwendung nurstrtolower
völlig in Ordnung wäre.quelle
Wenn Sie nach einer PHP 5.4-Version suchen und später antworten, ist hier der Code:
quelle
Gar nichts Besonderes, aber einfach und schnell wie die Hölle:
quelle
++$i
anstatt$i++
würde es auch ein bisschen schneller machen;)"CamelCase" bis "camel_case":
oder:
quelle
this-kind-of-output
Eine Version, die keinen regulären Ausdruck verwendet, finden Sie in der Alchitect- Quelle:
quelle
Also hier ist ein Einzeiler:
quelle
g
, diesem regulären Ausdruck einen Modifikator hinzuzufügen .g
und es funktioniert gut für mich.g
. Aber ich kann mich nicht an den Satz erinnern, mit dem ich getestet habe.danielstjules / Stringy hat eine Methode zum Konvertieren von Strings von Camelcase in Snakecase bereitgestellt.
quelle
Laravel 5.6 bietet eine sehr einfache Möglichkeit, dies zu tun:
Was es tut: Wenn es sieht, dass die angegebene Zeichenfolge mindestens einen Großbuchstaben enthält, verwendet es einen positiven Lookahead , um nach einem Zeichen (
.
) zu suchen, gefolgt von einem Großbuchstaben ((?=[A-Z])
). Anschließend wird das gefundene Zeichen durch seinen Wert ersetzt, gefolgt vom Trennzeichen_
.quelle
Der direkte Port von Schienen (abzüglich ihrer speziellen Behandlung für :: oder Akronyme) wäre
Wenn Sie PHP kennen, ist dies schneller als das manuelle Parsen, das in anderen hier gegebenen Antworten durchgeführt wird. Der Nachteil ist, dass Sie nicht auswählen können, was als Trennzeichen zwischen Wörtern verwendet werden soll, aber das war nicht Teil der Frage.
Überprüfen Sie auch den entsprechenden Rails-Quellcode
Beachten Sie, dass dies für die Verwendung mit ASCII-Kennungen vorgesehen ist. Wenn Sie dies mit Zeichen außerhalb des ASCII-Bereichs tun müssen, verwenden Sie den Modifikator '/ u' für
preg_match
und verwenden Siemb_strtolower
.quelle
Hier ist mein Beitrag zu einer sechs Jahre alten Frage mit Gott weiß, wie viele Antworten ...
Es werden alle Wörter in der bereitgestellten Zeichenfolge, die sich in camelcase befinden, in snakecase konvertiert. Zum Beispiel wird "SuperSpecialAwesome und auch FizBuzz καιΚάτιΑκόμα" in "super_special_awesome und auch fizz_buzz και_κάτι_ακόμα" konvertiert.
quelle
Yii2 hat die unterschiedliche Funktion, das Wort snake_case aus CamelCase zu erstellen.
quelle
Kurze Lösung:
quelle
Ich hatte ein ähnliches Problem, konnte jedoch keine Antwort finden, die die Konvertierung von CamelCase in snake_case erfüllt, wobei doppelte oder redundante Unterstriche vermieden wurden
_
für Namen mit Unterstrichen oder alle .Das Problem ist wie folgt:
Die Lösung, die ich geschrieben habe, ist ein einfacher Aufruf mit zwei Funktionen: Kleinbuchstaben und Suchen und Ersetzen nach aufeinanderfolgenden Kleinbuchstaben in Großbuchstaben:
quelle
quelle
$name{$k}
(oder$name[$k]
) auf Zeichen zugreifen , wodurch Ihr Code länger wird, aber der große Aufwand für die Konvertierung in und aus einem Array vermieden wird.Die schlechteste Antwort hier war so nah dran, die beste zu sein (benutze ein Framework). NEIN NICHT, schauen Sie sich einfach den Quellcode an. Zu sehen, was ein gut etabliertes Framework verwendet, wäre ein weitaus zuverlässigerer Ansatz (bewährt). Das Zend-Framework verfügt über einige Wortfilter, die Ihren Anforderungen entsprechen. Quelle .
Hier sind einige Methoden, die ich aus der Quelle angepasst habe.
quelle
Es gibt eine Bibliothek, die diese Funktionalität bietet:
quelle
Wenn Sie das Laravel-Framework verwenden, können Sie nur die Methode snake_case () verwenden.
quelle
Dies ist eine der kürzeren Möglichkeiten:
quelle
So entkamelisieren Sie ohne Regex:
Eine Bearbeitung:
Wie würde ich das 2019 machen:
Und wenn PHP 7.4 veröffentlicht wird:
quelle
Mit den Filterklassen der Zend Word-Filter ist dies ganz einfach :
quelle
Die Open-Source-TurboCommons-Bibliothek enthält eine universelle formatCase () -Methode innerhalb der StringUtils-Klasse, mit der Sie einen String in viele gängige Groß- und Kleinschreibung wie CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case und viele mehr konvertieren können.
https://github.com/edertone/TurboCommons
Um es zu verwenden, importieren Sie die Phar-Datei in Ihr Projekt und:
quelle
quelle
WENN Sie beginnen könnten mit:
Dann könnten Sie in beide Fälle konvertieren, nur mit:
Oder andere Fälle:
quelle