Jika saya memiliki:
$string = "PascalCase";
saya butuh
"pascal_case"
Apakah PHP menawarkan fungsi untuk tujuan ini?
php
string
pascalcasing
snakecasing
katak terbuka
sumber
sumber
Jawaban:
Coba ini untuk ukuran:
Keluaran:
Ini menerapkan aturan berikut:
sumber
Solusi yang lebih singkat: Mirip dengan solusi editor dengan ekspresi reguler yang disederhanakan dan memperbaiki masalah "trailing-underscore":
Demo PHP | Demo Regex
Perhatikan bahwa kasus seperti
SimpleXML
akan diubahsimple_x_m_l
menggunakan solusi di atas. Itu juga dapat dianggap sebagai penggunaan notasi huruf besar yang salah (benar akanSimpleXml
) daripada bug algoritma karena kasus seperti itu selalu ambigu - bahkan dengan mengelompokkan karakter huruf besar ke satu string (simple_xml
) algoritma seperti itu akan selalu gagal dalam kasus tepi lainnya sepertiXMLHTMLConverter
atau kata satu huruf dekat singkatan, dll. Jika Anda tidak keberatan tentang kasus tepi (agak jarang) dan ingin menanganiSimpleXML
dengan benar, Anda dapat menggunakan solusi yang sedikit lebih kompleks:Demo PHP | Demo Regex
sumber
Solusi singkat dan dapat menangani beberapa kasus penggunaan yang rumit:
Dapat menangani semua kasus ini:
Anda dapat menguji fungsi ini di sini: http://syframework.alwaysdata.net/decamelize
sumber
Diangkut dari Ruby
String#camelize
danString#decamelize
.Salah satu trik yang mungkin terlewatkan oleh solusi di atas adalah pengubah 'e' yang menyebabkan
preg_replace
mengevaluasi string pengganti sebagai kode PHP.sumber
e
bendera untukpreg_replace
yaitu yang usang dalam PHP 5.5.^|
ataustrlen
.The Symfony Serializer Komponen memiliki CamelCaseToSnakeCaseNameConverter yang memiliki dua metode
normalize()
dandenormalize()
. Ini dapat digunakan sebagai berikut:sumber
$nameConverter->normalize('CamelCase')
output_camel_case
dalam versi 3.2 dari Symfony Serializer Component.Sebagian besar solusi di sini terasa berat. Inilah yang saya gunakan:
"CamelCASE" diubah menjadi "camel_case"
lcfirst($camelCase)
akan menurunkan karakter pertama (hindari keluaran yang dikonversi 'CamelCASE' untuk memulai dengan garis bawah)[A-Z]
menemukan huruf kapital+
akan memperlakukan setiap huruf besar yang berurutan sebagai sebuah kata (hindari 'CamelCASE' untuk diubah menjadi camel_C_A_S_E)ThoseSPECCases
->,those_spec_cases
bukanthose_speccases
strtolower([…])
mengubah keluaran menjadi huruf kecilsumber
lcfirst
fungsi ke $ucfirst()
panggilan tersebut.USADollarSymbol
menjadiu_sa_dollar_symbol
Demo Saya tidak merekomendasikan solusi ini karena harus membuat dua lintasan melalui string input dengan regex - tanda pola yang tidak dimurnikan.php tidak menawarkan fungsi bawaan untuk afaik ini, tapi inilah yang saya gunakan
splitter dapat ditentukan dalam pemanggilan fungsi, sehingga Anda dapat memanggilnya seperti itu
sumber
mb_strtolower
dan/u
opsi aktifpreg_replace
.Anda perlu menjalankan regex yang cocok dengan setiap huruf besar kecuali di awal dan menggantinya dengan garis bawah ditambah huruf itu. Solusi utf-8 adalah ini:
Jika Anda tidak yakin dengan huruf besar apa string Anda, lebih baik periksa dulu, karena kode ini mengasumsikan bahwa masukannya
camelCase
bukanunderscore_Case
ataudash-Case
, jadi jika latters memiliki huruf besar, itu akan menambahkan garis bawah ke dalamnya.Jawaban yang diterima dari cletus terlalu rumit dan hanya berfungsi dengan karakter latin. Saya merasa itu solusi yang sangat buruk dan bertanya-tanya mengapa itu diterima sama sekali. Mengubah
TEST123String
menjaditest123_string
belum tentu merupakan persyaratan yang valid. Saya lebih suka membuatnya sederhana dan dipisahkanABCccc
menjadia_b_cccc
bukanab_cccc
karena tidak kehilangan informasi dengan cara ini dan konversi mundur akan memberikan string yang sama persis dengan yang kita mulai. Meskipun Anda ingin melakukannya dengan cara lain, relatif mudah untuk menulis regex untuknya dengan tampilan positif(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
atau dua ekspresi reguler tanpa tampilan belakang jika Anda bukan ahli ekspresi reguler. Tidak perlu membaginya menjadi beberapa substring, apalagi memutuskan antarastrtolower
dan dilcfirst
mana menggunakan juststrtolower
akan baik-baik saja.sumber
Jika Anda mencari versi PHP 5.4 dan jawaban yang lebih baru di sini adalah kodenya:
sumber
Tidak mewah sama sekali tapi sederhana dan cepat sekali:
sumber
++$i
alih-alih$i++
membuatnya sedikit lebih cepat juga;)"CamelCase" menjadi "camel_case":
atau:
sumber
this-kind-of-output
Versi yang tidak menggunakan regex dapat ditemukan di sumber Alchitect :
sumber
Jadi ini satu baris:
sumber
g
pengubah ke regex ini.g
dan berfungsi dengan baik untuk saya.g
. Tapi saya tidak ingat frase yang saya uji.danielstjules / Stringy menyediakan metode untuk mengubah string dari camelcase ke snakecase.
sumber
Laravel 5.6 menyediakan cara yang sangat sederhana untuk melakukan ini:
Apa fungsinya: jika terlihat bahwa setidaknya ada satu huruf kapital dalam string yang diberikan, ia menggunakan a lookahead positif untuk mencari karakter apa pun (
.
) diikuti dengan huruf kapital ((?=[A-Z])
). Ini kemudian menggantikan karakter yang ditemukan dengan nilainya diikuti oleh pemisah_
.sumber
Port langsung dari rel (tanpa penanganan khusus untuk :: atau akronim) akan menjadi
Mengetahui PHP, ini akan lebih cepat daripada penguraian manual yang terjadi di jawaban lain yang diberikan di sini. Kerugiannya adalah Anda tidak bisa memilih apa yang akan digunakan sebagai pemisah antar kata, tetapi itu bukan bagian dari pertanyaan.
Juga periksa kode sumber rel yang relevan
Perhatikan bahwa ini dimaksudkan untuk digunakan dengan pengenal ASCII. Jika Anda perlu melakukan ini dengan karakter di luar rentang ASCII, gunakan pengubah '/ u' untuk
preg_match
dan digunakanmb_strtolower
.sumber
Inilah kontribusi saya untuk pertanyaan berusia enam tahun dengan entah berapa banyak jawaban ...
Ini akan mengubah semua kata dalam string yang disediakan yang ada di camelcase menjadi snakecase. Misalnya "SuperSpecialAwesome dan juga FizBuzz καιΚάτιΑκόμα" akan diubah menjadi "super_special_awesome dan juga fizz_buzz και_κάτι_ακόμα".
sumber
Yii2 memiliki fungsi berbeda untuk membuat kata snake_case dari CamelCase.
sumber
Solusi singkat:
sumber
Saya memiliki masalah serupa tetapi tidak dapat menemukan jawaban yang memuaskan tentang cara mengonversi CamelCase ke snake_case, sambil menghindari garis bawah duplikat atau berlebihan
_
untuk nama dengan garis bawah, atau singkatan huruf besar semua.Masalahnya adalah sebagai berikut:
Solusi yang saya tulis adalah panggilan dua fungsi sederhana, huruf kecil dan cari dan ganti untuk huruf kecil-besar yang berurutan:
sumber
sumber
$name{$k}
(atau$name[$k]
), yang akan membuat kode Anda lebih panjang, tetapi menghindari overhead besar untuk mengonversinya ke dan dari larik.Jawaban terburuk di sini sangat dekat dengan yang terbaik (gunakan kerangka kerja). JANGAN JANGAN, lihat saja kode sumbernya. melihat apa yang digunakan kerangka kerja mapan akan menjadi pendekatan yang jauh lebih andal (dicoba dan diuji). Kerangka Zend memiliki beberapa filter kata yang sesuai dengan kebutuhan Anda. Sumber .
berikut adalah beberapa metode yang saya adaptasi dari sumbernya.
sumber
Ada perpustakaan yang menyediakan fungsionalitas ini:
sumber
Jika Anda menggunakan framework Laravel, Anda dapat menggunakan metode snake_case () saja .
sumber
Ini adalah salah satu cara yang lebih singkat:
sumber
Cara menghapus camelize tanpa menggunakan regex:
Sebuah edit:
Bagaimana saya melakukannya di 2019:
Dan saat PHP 7.4 akan dirilis:
sumber
Sangat mudah menggunakan kelas Filter dari Zend Word Filters :
sumber
Pustaka TurboCommons open source berisi metode formatCase () tujuan umum di dalam kelas StringUtils, yang memungkinkan Anda mengonversi string ke banyak format kasus umum, seperti CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case, dan banyak lagi.
https://github.com/edertone/TurboCommons
Untuk menggunakannya, impor file phar ke proyek Anda dan:
sumber
sumber
JIKA Anda bisa mulai dengan:
Kemudian Anda dapat mengonversi ke salah satu kasus hanya dengan:
Atau kasus lainnya:
sumber