Если бы у меня было:
$string = "PascalCase";
я нуждаюсь
"pascal_case"
Предлагает ли PHP функцию для этой цели?
php
string
pascalcasing
snakecasing
openfrog
источник
источник
Ответы:
Примерьте это на размер:
Вывод:
Это реализует следующие правила:
источник
Более короткое решение: аналогично редактору с упрощенным регулярным выражением и исправлением проблемы "подчеркивания в конце":
Демо PHP | Демо Regex
Обратите внимание, что такие случаи
SimpleXML
будут преобразованы вsimple_x_m_l
использование вышеуказанного решения. Это также можно считать неправильным использованием обозначения верблюжьего регистра (правильным было быSimpleXml
), а не ошибкой алгоритма, поскольку такие случаи всегда неоднозначны - даже путем группировки символов верхнего регистра в одну строку (simple_xml
) такой алгоритм всегда будет терпеть неудачу в других крайних случаях например,XMLHTMLConverter
или однобуквенные слова рядом с сокращениями и т. д. Если вы не возражаете против (довольно редких) крайних случаев и хотите обрабатыватьSimpleXML
правильно, вы можете использовать немного более сложное решение:Демо PHP | Демо Regex
источник
Краткое решение, способное справиться с некоторыми сложными случаями использования:
Может справиться со всеми этими случаями:
Вы можете протестировать эту функцию здесь: http://syframework.alwaysdata.net/decamelize
источник
Портировано из Ruby's
String#camelize
иString#decamelize
.Одна уловка, которую могли упустить вышеупомянутые решения, - это модификатор 'e', который заставляет
preg_replace
оценивать строку замены как код PHP.источник
e
Флагpreg_replace
является устаревшим в PHP 5.5.^|
илиstrlen
.Symfony Serializer имеет CamelCaseToSnakeCaseNameConverter, который имеет два метода
normalize()
иdenormalize()
. Их можно использовать следующим образом:источник
$nameConverter->normalize('CamelCase')
выводит_camel_case
в текущей версии 3.2 компонента Symfony Serializer.Большинство решений здесь кажутся тяжелыми. Вот что я использую:
«CamelCASE» преобразуется в «camel_case»
lcfirst($camelCase)
понизит первый символ (избегает преобразованного вывода 'CamelCASE', чтобы он начинался с подчеркивания)[A-Z]
находит заглавные буквы+
будет обрабатывать каждый последующий верхний регистр как слово (избегает преобразования CamelCASE в camel_C_A_S_E)ThoseSPECCases
->those_spec_cases
вместоthose_speccases
strtolower([…])
переводит вывод в нижний регистристочник
lcfirst
функцию в $ camelCaseucfirst()
вызова.USADollarSymbol
становитсяu_sa_dollar_symbol
Demo. Я не рекомендую это решение, потому что оно должно выполнить два прохода через входную строку с регулярным выражением - признак неочищенного шаблона.php не предлагает встроенной функции для этого afaik, но вот что я использую
разделитель может быть указан в вызове функции, поэтому вы можете называть его так
источник
mb_strtolower
и/u
включить опциюpreg_replace
.Вам нужно запустить через него регулярное выражение, которое соответствует каждой заглавной букве, за исключением того, если оно находится в начале, и заменить его подчеркиванием плюс эта буква. Решение utf-8 таково:
Если вы не уверены, в каком регистре ваша строка, лучше сначала ее проверить, потому что этот код предполагает, что ввод
camelCase
вместоunderscore_Case
илиdash-Case
, поэтому, если последние имеют прописные буквы, он добавит к ним подчеркивания.Принятый ответ от cletus слишком сложен imho и работает только с латинскими символами. Я считаю это действительно плохим решением и задаюсь вопросом, почему оно вообще было принято. Преобразование
TEST123String
вtest123_string
не обязательно является допустимым требованием. Я предпочел сохранить его простым и разделеннымABCccc
наa_b_cccc
вместо этого,ab_cccc
потому что он не теряет информацию таким образом, и обратное преобразование даст ту же самую строку, с которой мы начали. Даже если вы хотите сделать это по-другому, относительно легко написать для него регулярное выражение с положительным просмотром назад(?<!^)\p{Lu}\p{Ll}|(?<=\p{Ll})\p{Lu}
или два регулярных выражения без просмотра назад, если вы не являетесь экспертом по регулярным выражениям. Нет необходимости разбивать его на подстроки, не говоря уже о выборе междуstrtolower
иlcfirst
где использованиеstrtolower
было бы совершенно нормально.источник
Если вы ищете версию PHP 5.4 и более позднюю, ответьте вот на этот код:
источник
Совсем не причудливо, но просто и чертовски быстро:
источник
++$i
вместо того,$i++
чтобы сделать его немного быстрее;)«CamelCase» в «camel_case»:
или:
источник
this-kind-of-output
Версию, в которой не используется регулярное выражение, можно найти в исходном коде Alchitect :
источник
Итак, вот однострочный:
источник
g
модификатор к этому регулярному выражению.g
и у меня работает нормально.g
. Но я не могу вспомнить фразу, которую тестировал.danielstjules / Stringy предлагает метод преобразования строки из camelcase в snakecase.
источник
Laravel 5.6 предоставляет очень простой способ сделать это:
Что он делает: если он видит, что в данной строке есть хотя бы одна заглавная буква, он использует положительный просмотр вперед для поиска любого символа (
.
), за которым следует заглавная буква ((?=[A-Z])
). Затем он заменяет найденный символ его значением, за которым следует разделитель_
.источник
Прямой перенос с рельсов (без особой обработки :: или акронимов) будет
Зная PHP, это будет быстрее, чем ручной синтаксический анализ, который происходит в других приведенных здесь ответах. Недостатком является то, что вы не можете выбрать, что использовать в качестве разделителя между словами, но это не было частью вопроса.
Также проверьте соответствующий исходный код rails
Обратите внимание, что это предназначено для использования с идентификаторами ASCII. Если вам нужно сделать это с символами вне диапазона ASCII, используйте модификатор '/ u' для
preg_match
и используйтеmb_strtolower
.источник
Вот мой вклад в вопрос шестилетней давности, на который черт знает сколько ответов ...
Он преобразует все слова в предоставленной строке, записанные в camelcase, в snakecase. Например, «SuperSpecialAwesome, а также FizBuzz καιΚάτιΑκόμα» будет преобразован в «super_special_awesome, а также fizz_buzz και_κάτι_ακόμα».
источник
Yii2 имеет другую функцию для преобразования слова snake_case из CamelCase.
источник
Краткое решение:
источник
У меня была аналогичная проблема, но я не смог найти ни одного ответа, который бы удовлетворял преобразованию CamelCase в snake_case, избегая при этом повторяющихся или избыточных подчеркиваний
_
для имен с подчеркиванием или аббревиатур с заглавными буквами.Проблема заключается в следующем:
Решение, которое я написал, представляет собой простой вызов двух функций, нижний регистр и поиск и замену последовательных букв нижнего и верхнего регистра:
источник
источник
$name{$k}
(или$name[$k]
), что сделает ваш код длиннее, но позволяет избежать больших накладных расходов на преобразование его в массив и из него.Худший ответ здесь был так близок к лучшему (используйте фреймворк). НЕТ, просто взгляните на исходный код. гораздо более надежный подход (опробованный и проверенный) было бы увидеть, что использует хорошо зарекомендовавшая себя структура. Во фреймворке Zend есть несколько фильтров слов, которые соответствуют вашим потребностям. Источник .
вот пара методов, которые я адаптировал из источника.
источник
Существует библиотека, обеспечивающая эту функциональность:
источник
Если вы используете фреймворк Laravel, вы можете использовать только метод snake_case () .
источник
Это один из более коротких способов:
источник
Как де-камелизовать без использования регулярного выражения:
Редактирование:
Как бы я это сделал в 2019 году:
И когда выйдет PHP 7.4:
источник
Использовать классы фильтров Zend Word Filters легко :
источник
Библиотека TurboCommons с открытым исходным кодом содержит метод formatCase () общего назначения внутри класса StringUtils, который позволяет преобразовывать строку во множество распространенных форматов регистра, например CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case и многие другие.
https://github.com/edertone/TurboCommons
Чтобы использовать его, импортируйте файл phar в свой проект и:
источник
источник
ЕСЛИ вы могли бы начать с:
Затем вы можете преобразовать в любой из этих случаев с помощью:
Или любые другие случаи:
источник