Преобразование тире в CamelCase в PHP

91

Может ли кто-нибудь помочь мне выполнить эту функцию PHP? Я хочу взять строку, подобную этой: 'this-is-a-string', и преобразовать ее в эту: 'thisIsAString':

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
    // Do stuff


    return $string;
}
Кирк Уимет
источник

Ответы:

185

Никаких регулярных выражений или обратных вызовов не требуется. Практически всю работу можно проделать с помощью ucwords:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) 
{

    $str = str_replace(' ', '', ucwords(str_replace('-', ' ', $string)));

    if (!$capitalizeFirstCharacter) {
        $str[0] = strtolower($str[0]);
    }

    return $str;
}

echo dashesToCamelCase('this-is-a-string');

Если вы используете PHP> = 5.3, вы можете использовать lcfirst вместо strtolower.

Обновить

Второй параметр был добавлен в ucwords в PHP 5.4.32 / 5.5.16, что означает, что нам не нужно сначала заменять тире на пробелы (спасибо Lars Ebert и PeterM за указание на это). Вот обновленный код:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) 
{

    $str = str_replace('-', '', ucwords($string, '-'));

    if (!$capitalizeFirstCharacter) {
        $str = lcfirst($str);
    }

    return $str;
}

echo dashesToCamelCase('this-is-a-string');
Webbiedave
источник
18
if (!$capitalizeFirstCharacter) { $str = lcfirst($str); }
AVProgrammer
3
Обратите внимание, что ucwordsфактически принимает разделитель в качестве второго параметра (см. Ответ PeterM ), поэтому один из str_replaceвызовов будет ненужным.
Ларс Эберт
Спасибо за информацию @LarsEbert. Я обновил ответ.
webbiedave
Условие может быть переписано с использованием тернарного оператора в $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;основном для удобства чтения (хотя некоторые могут не согласиться) и / или уменьшения сложности кода.
Крис Афанасиадис
55

Это можно сделать очень просто, используя ucwords, который принимает разделитель как параметр:

function camelize($input, $separator = '_')
{
    return str_replace($separator, '', ucwords($input, $separator));
}

ПРИМЕЧАНИЕ: нужен php не ниже 5.4.32, 5.5.16

PeterM
источник
33
Это вернет что-то вроде CamelCase - если вы хотите, чтобы это было что-то вроде camelCase, тогда:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Джефф С.
ucwordsимеет второй параметр delimiter, поэтому str_replace("_", "", ucwords($input, "_"));он достаточно хорош (в большинстве случаев: P
wbswjc
8

это мой вариант того, как с этим бороться. Здесь у меня есть две функции: первая - camelCase - превращает что угодно в camelCase, и ничего страшного не произойдет, если переменная уже содержит camelCase. Второй uncamelCase превращает camelCase в подчеркивание (отличная функция при работе с ключами базы данных).

function camelCase($str) {
    $i = array("-","_");
    $str = preg_replace('/([a-z])([A-Z])/', "\\1 \\2", $str);
    $str = preg_replace('@[^a-zA-Z0-9\-_ ]+@', '', $str);
    $str = str_replace($i, ' ', $str);
    $str = str_replace(' ', '', ucwords(strtolower($str)));
    $str = strtolower(substr($str,0,1)).substr($str,1);
    return $str;
}
function uncamelCase($str) {
    $str = preg_replace('/([a-z])([A-Z])/', "\\1_\\2", $str);
    $str = strtolower($str);
    return $str;
}

давайте протестируем оба:

$camel = camelCase("James_LIKES-camelCase");
$uncamel = uncamelCase($camel);
echo $camel." ".$uncamel;
Playnox
источник
Эта функция возвращает jamesLikesCameAse для camelCase вместо jamesLikesCameCase
Алари Труутс
8

Перегружен однострочный, с блоком документов ...

/**
 * Convert underscore_strings to camelCase (medial capitals).
 *
 * @param {string} $str
 *
 * @return {string}
 */
function snakeToCamel ($str) {
  // Remove underscores, capitalize words, squash, lowercase first.
  return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $str))));
}
даблджош
источник
Это вернетсяnull
PeterM
Функция отсутствовала return... обновлена, спасибо. Вот ссылка для тестирования этого 3v4l.org/YBHPd
doublejosh
6
Успокойся, приятель, только что пропустил возвращение. Оставайтесь позитивными в отношении SO.
doublejosh
5

Я бы, наверное, использовал preg_replace_callback()вот так:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
  return preg_replace_callback("/-[a-zA-Z]/", 'removeDashAndCapitalize', $string);
}

function removeDashAndCapitalize($matches) {
  return strtoupper($matches[0][1]);
}
Джереми Рутен
источник
4

Вы ищете preg_replace_callback , вы можете использовать его так:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) {
     return ucfirst($matches[1]);
}, $dashes);
Закурить
источник
4
function camelize($input, $separator = '_')
{
    return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
}

echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';
Блавей Кшакала
источник
3
$string = explode( "-", $string );
$first = true;
foreach( $string as &$v ) {
    if( $first ) {
        $first = false;
        continue;
    }
    $v = ucfirst( $v );
}
return implode( "", $string );

Непроверенный код. Проверьте документацию PHP на наличие функций im- / explode и ucfirst.

свенс
источник
3

Один лайнер, PHP> = 5.3:

$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));
Тим
источник
1
пожалуйста, добавьте объяснение, как это может / поможет OP
davejal
2

вот очень-очень простое решение в однострочном коде

    $string='this-is-a-string' ;

   echo   str_replace('-', '', ucwords($string, "-"));

вывод ThisIsAString

Аббас хан
источник
1

В качестве альтернативы, если вы предпочитаете не иметь дело с регулярным выражением и хотите избежать явных циклов:

// $key = 'some-text', after transformation someText            
$key = lcfirst(implode('', array_map(function ($key) {
    return ucfirst($key);
}, explode('-', $key))));
Виктор Фараждаги
источник
1

Еще один простой подход:

$nasty = [' ', '-', '"', "'"]; // array of nasty characted to be removed
$cameled = lcfirst(str_replace($nasty, '', ucwords($string)));
Г-н Сорбозе
источник
1

Библиотека TurboCommons содержит метод formatCase () общего назначения внутри класса StringUtils, который позволяет преобразовывать строку во множество распространенных форматов регистров, например CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case и многие другие.

https://github.com/edertone/TurboCommons

Чтобы использовать его, импортируйте файл phar в свой проект и:

use org\turbocommons\src\main\php\utils\StringUtils;

echo StringUtils::formatCase('sNake_Case', StringUtils::FORMAT_CAMEL_CASE);

// will output 'sNakeCase'

Вот ссылка на исходный код метода:

https://github.com/edertone/TurboCommons/blob/b2e015cf89c8dbe372a5f5515e7d9763f45eba76/TurboCommons-Php/src/main/php/utils/StringUtils.php#L653

Жауме Муссонс Абад
источник
1

Попробуй это:

$var='snake_case';
echo ucword($var,'_');

Выход:

Snake_Case remove _ with str_replace
dılo sürücü
источник
1

В использовании Laravel Str::camel()

use Illuminate\Support\Str;

$converted = Str::camel('foo_bar');

// fooBar
Рональд Араужо
источник
0
function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

Очевидно, что если другой разделитель, кроме '-', например '_', тоже должен быть сопоставлен, тогда это не сработает, тогда preg_replace может сначала преобразовать все (последовательные) разделители в '-' в $ text ...

PeerGum
источник
Я действительно не понимаю, насколько это проще, яснее или лучше, чем решение, предоставленное (и принятое) около 4 лет назад.
ccjmne
0

Эта функция похожа на функцию @Svens.

function toCamelCase($str, $first_letter = false) {
    $arr = explode('-', $str);
    foreach ($arr as $key => $value) {
        $cond = $key > 0 || $first_letter;
        $arr[$key] = $cond ? ucfirst($value) : $value;
    }
    return implode('', $arr);
}

Но яснее (я думаю: D) и с необязательным параметром, чтобы первая буква была заглавной или нет.

Применение:

$dashes = 'function-test-camel-case';
$ex1 = toCamelCase($dashes);
$ex2 = toCamelCase($dashes, true);

var_dump($ex1);
//string(21) "functionTestCamelCase"
var_dump($ex2);
//string(21) "FunctionTestCamelCase"
Фелипе Насименто
источник
0

Если вы используете фреймворк Laravel, вы можете использовать только метод camel_case () .

camel_case('this-is-a-string') // 'thisIsAString'
Марек Скиба
источник
0

Вот еще вариант:

private function camelcase($input, $separator = '-')     
{
    $array = explode($separator, $input);

    $parts = array_map('ucwords', $array);

    return implode('', $parts);
}
Мариано Эчеверриа
источник
0

$stringWithDash = 'Pending-Seller-Confirmation'; $camelize = str_replace('-', '', ucwords($stringWithDash, '-')); echo $camelize; вывод: PendingSellerConfirmation

ucwordsВторой (необязательный) параметр помогает определить разделитель для преобразования строки в верблюд. str_replaceиспользуется для завершения вывода путем удаления разделителя.

RT
источник
0

Вот небольшая вспомогательная функция, использующая функциональный подход array_reduce . Требуется как минимум PHP 7.0

private function toCamelCase(string $stringToTransform, string $delimiter = '_'): string
{
    return array_reduce(
        explode($delimiter, $stringToTransform),
        function ($carry, string $part): string {
            return $carry === null ? $part: $carry . ucfirst($part);
        }
    );
}
cb0
источник
0

Выше было много хороших решений, и я могу предложить другой способ, о котором раньше никто не упоминал. В этом примере используется массив. Я использую этот метод в своем проекте Shieldon Firewall .

/**
 * Covert string with dashes into camel-case string.
 *
 * @param string $string A string with dashes.
 *
 * @return string
 */
function getCamelCase(string $string = '')
{
    $str = explode('-', $string);
    $str = implode('', array_map(function($word) {
        return ucwords($word); 
    }, $str));

    return $str;
}

Попробуй это:

echo getCamelCase('This-is-example');

Результат:

ThisIsExample
Терри Лин
источник
-2

Это проще:

$string = preg_replace( '/-(.?)/e',"strtoupper('$1')", strtolower( $string ) );
Snwalkunde
источник
Модификатор / e устарел в PHP 5.5.
Ондрей Мачулда