Jeśli miałbym:
$string = "PascalCase";
potrzebuję
"pascal_case"
Czy PHP oferuje funkcję do tego celu?
php
string
pascalcasing
snakecasing
openfrog
źródło
źródło
Odpowiedzi:
Wypróbuj ten rozmiar:
Wynik:
To implementuje następujące zasady:
źródło
Krótsze rozwiązanie: podobne do edytora z uproszczonym wyrażeniem regularnym i naprawiającym problem „końcowego podkreślenia”:
Demo PHP | Regex Demo
Zwróć uwagę, że przypadki takie jak
SimpleXML
zostaną przekonwertowane nasimple_x_m_l
przy użyciu powyższego rozwiązania. Można to również uznać za niewłaściwe użycie notacji wielkości liter wielbłąda (poprawne byłobySimpleXml
) zamiast błędu algorytmu, ponieważ takie przypadki są zawsze niejednoznaczne - nawet poprzez zgrupowanie wielkich liter w jeden ciąg (simple_xml
) taki algorytm zawsze zawiedzie w innych przypadkach skrajnych podobneXMLHTMLConverter
lub jednoliterowe słowa w pobliżu skrótów itp. Jeśli nie masz nic przeciwko (raczej rzadkim) skrajnym przypadkom i chceszSimpleXML
poprawnie obsłużyć , możesz użyć nieco bardziej złożonego rozwiązania:Demo PHP | Regex Demo
źródło
Zwięzłe rozwiązanie i poradzi sobie z trudnymi przypadkami użycia:
Może obsłużyć wszystkie te przypadki:
Możesz przetestować tę funkcję tutaj: http://syframework.alwaysdata.net/decamelize
źródło
Przeniesione z Ruby's
String#camelize
iString#decamelize
.Jedną ze sztuczek, które mogły zostać pominięte w powyższych rozwiązaniach, jest modyfikator „e”, który powoduje
preg_replace
obliczenie zastępczego ciągu znaków jako kodu PHP.źródło
e
Flag napreg_replace
jest przestarzałe w PHP 5.5.^|
anistrlen
.Symfony serializer Komponent ma CamelCaseToSnakeCaseNameConverter że ma dwie metody
normalize()
idenormalize()
. Można ich używać w następujący sposób:źródło
$nameConverter->normalize('CamelCase')
wyjścia_camel_case
w aktualnej wersji 3.2 komponentu Symfony Serializer.Większość rozwiązań jest tutaj ciężka. Oto czego używam:
„CamelCASE” jest konwertowany na „camel_case”
lcfirst($camelCase)
obniży pierwszy znak (pozwala uniknąć konwersji danych wyjściowych „CamelCASE” na początek podkreślenia)[A-Z]
znajduje wielkie litery+
potraktuje każdą kolejną wielką literę jako słowo (unika konwersji „CamelCASE” na camel_C_A_S_E)ThoseSPECCases
->those_spec_cases
zamiastthose_speccases
strtolower([…])
zamienia dane wyjściowe na małe literyźródło
lcfirst
funkcję do $ camelCaseucfirst()
wywołania.USADollarSymbol
staje sięu_sa_dollar_symbol
Demo Nie polecam tego rozwiązania, ponieważ musi wykonać dwa przejścia przez ciąg wejściowy z wyrażeniem regularnym - znakiem nierafinowanego wzorca.php nie oferuje wbudowanej funkcji dla tego afaika, ale oto czego używam
rozdzielacz można określić w wywołaniu funkcji, więc możesz go wywołać w ten sposób
źródło
mb_strtolower
i włączyć/u
opcjępreg_replace
.Musisz przepuścić przez to wyrażenie regularne, które pasuje do każdej dużej litery, z wyjątkiem sytuacji, gdy jest na początku, i zastąpić je podkreśleniem i tą literą. Oto rozwiązanie UTF-8:
Jeśli nie jesteś pewien, jaką wielkością jest Twój ciąg, lepiej najpierw go sprawdzić, ponieważ ten kod zakłada, że dane wejściowe to
camelCase
zamiastunderscore_Case
lubdash-Case
, więc jeśli ostatnie litery mają duże litery, doda do nich podkreślenia.Przyjęta odpowiedź od cletus jest zbyt skomplikowana i działa tylko w przypadku znaków łacińskich. Uważam, że to naprawdę złe rozwiązanie i zastanawiam się, dlaczego w ogóle zostało zaakceptowane. Konwersja
TEST123String
natest123_string
niekoniecznie jest ważnym wymaganiem. Utrzymałem to raczej w prostocie i rozdzieleniuABCccc
naa_b_cccc
zamiast,ab_cccc
ponieważ nie traci w ten sposób informacji, a konwersja wsteczna da dokładnie ten sam ciąg, od którego zaczęliśmy. Nawet jeśli chcesz to zrobić w inny sposób, stosunkowo łatwo jest napisać dla niego wyrażenie regularne z dodatnim lookbehind(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
lub dwoma wyrażeniami regularnymi bez lookbehind, jeśli nie jesteś ekspertem od wyrażeń regularnych. Nie ma potrzeby dzielenia go na podciągi, nie wspominając o decydowaniu, gdziestrtolower
ilcfirst
gdzie użyciestrtolower
byłoby całkowicie w porządku.źródło
Jeśli szukasz wersji PHP 5.4 i późniejszej odpowiedzi, oto kod:
źródło
Wcale nie wyszukane, ale proste i szybkie jak diabli:
źródło
++$i
zamiast$i++
to trochę przyspieszyć;)„CamelCase” na „camel_case”:
lub:
źródło
this-kind-of-output
Wersję, która nie używa wyrażenia regularnego, można znaleźć w źródle Alchitect :
źródło
Więc tutaj jest jedna linijka:
źródło
g
modyfikatora do tego wyrażenia regularnego.g
i działa dobrze dla mnie.g
. Ale nie pamiętam frazy, z którą testowałem.danielstjules / Stringy zapewnił metodę konwersji łańcucha znaków z wielbłąda na futerał węża.
źródło
Laravel 5.6 zapewnia bardzo prosty sposób na zrobienie tego:
Co robi: jeśli widzi, że w danym ciągu znajduje się co najmniej jedna duża litera, używa dodatniego lookahead, aby wyszukać dowolny znak (
.
), po którym następuje duża litera ((?=[A-Z])
). Następnie zastępuje znaleziony znak jego wartością, po której następuje separator_
.źródło
Bezpośrednim portem z railsów (bez ich specjalnej obsługi dla :: lub akronimów) byłoby
Znając PHP, będzie to szybsze niż ręczne analizowanie, które ma miejsce w innych odpowiedziach podanych tutaj. Wadą jest to, że nie możesz wybrać, czego użyć jako separatora między słowami, ale nie było to częścią pytania.
Sprawdź również kod źródłowy odpowiednich railsów
Należy pamiętać, że jest to przeznaczone do użytku z identyfikatorami ASCII. Jeśli musisz to zrobić ze znakami spoza zakresu ASCII, użyj modyfikatora „/ u”
preg_match
i użyjmb_strtolower
.źródło
Oto mój wkład w pytanie od sześciu lat, w którym Bóg wie, ile odpowiedzi ...
Konwertuje wszystkie słowa w podanym ciągu, które są w postaci wielbłąda, na futerał węża. Na przykład „SuperSpecialAwesome, a także FizBuzz καιΚάτιΑκόμα” zostaną przekonwertowane na „super_special_awesome, a także fizz_buzz και_κάτι_ακόμα”.
źródło
Yii2 ma inną funkcję, aby utworzyć słowo snake_case z CamelCase.
źródło
Krótkie rozwiązanie:
źródło
Miałem podobny problem, ale nie mogłem znaleźć żadnej odpowiedzi, która byłaby satysfakcjonująca, jak przekonwertować CamelCase na snake_case, unikając zduplikowanych lub zbędnych podkreśleń
_
dla nazw z podkreśleniami lub wszystkimi skrótami .Problem jest następujący:
Rozwiązanie, które napisałem, to proste wywołanie dwóch funkcji, małe litery i wyszukiwanie oraz zamiana na kolejne małe i duże litery:
źródło
źródło
$name{$k}
(lub$name[$k]
), co wydłużyłoby twój kod, ale pozwala uniknąć dużego narzutu konwersji do iz tablicy.Najgorsza odpowiedź była tak bliska bycia najlepszą (użyj frameworka). NIE NIE, po prostu spójrz na kod źródłowy. zobaczenie, jakie zastosowania mają dobrze ugruntowane ramy, byłoby znacznie bardziej niezawodnym podejściem (wypróbowanym i przetestowanym). Framework Zend ma kilka filtrów słów, które odpowiadają Twoim potrzebom. Źródło .
oto kilka metod, które zaadaptowałem ze źródła.
źródło
Istnieje biblioteka zapewniająca taką funkcjonalność:
źródło
Jeśli używasz frameworka Laravel, możesz użyć po prostu metody snake_case () .
źródło
To jeden z krótszych sposobów:
źródło
Jak usunąć kamelizację bez użycia wyrażenia regularnego:
Edycja:
Jak bym to zrobił w 2019 roku:
A kiedy pojawi się PHP 7.4:
źródło
Korzystanie z klas filtrów w Zend Word Filters jest łatwe :
źródło
Biblioteka TurboCommons typu open source zawiera metodę formatCase () ogólnego przeznaczenia w klasie StringUtils, która umożliwia konwersję ciągu znaków na wiele popularnych formatów liter, takich jak CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case i wiele innych.
https://github.com/edertone/TurboCommons
Aby z niego skorzystać, zaimportuj plik phar do swojego projektu i:
źródło
źródło
JEŚLI mógłbyś zacząć od:
Następnie możesz przekonwertować na dowolny przypadek tylko za pomocą:
Lub w innych przypadkach:
źródło