Подтвердить что ты не робот

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

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

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


    return $string;
}
4b9b3361

Ответ 1

Нет необходимости в регулярном выражении или обратном вызове. Почти все работы могут выполняться с помощью 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.

Update

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

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

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

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

    return $str;
}

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

Ответ 2

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

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

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

Ответ 3

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

function camelCase($str) {
    $i = array("-","_");
    $str = preg_replace('/([a-z])([A-Z])/', "\\1 \\2", $str);
    $str = preg_replace('@[^a-zA-Z0-9\-_ ][email protected]', '', $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;

Ответ 4

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

/**
 * 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))));
}

Ответ 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]);
}

Ответ 6

Вы ищете preg_replace_callback, вы можете использовать его следующим образом:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) {
     return ucfirst($matches[1]);
}, $dashes);

Ответ 7

$string = explode( "-", $string );
$first = true;
foreach( $string as &$v ) {
    if( $first ) {
        $first = false;
        continue;
    }
    $v = ucfirst( $v );
}
return implode( "", $string );

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

Ответ 8

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

echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';

Ответ 9

Один вкладыш, PHP >= 5.3:

$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));

Ответ 10

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

// $key = 'some-text', after transformation someText            
$key = lcfirst(implode('', array_map(function ($key) {
    return ucfirst($key);
}, explode('-', $key))));

Ответ 11

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

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

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

вывод ThisIsAString

Ответ 12

Библиотека 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

Ответ 13

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

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

Выход:

Snake_Case remove _ with str_replace

Ответ 14

function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

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

Ответ 15

Эта функция аналогична функции @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"

Ответ 16

Другой простой подход:

$nasty = [' ', '-', '"', "'"]; // array of nasty characted to be removed
$cameled = lcfirst(str_replace($nasty, '', ucwords($string)));

Ответ 17

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

camel_case('this-is-a-string') // 'thisIsAString'

Ответ 18

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

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

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

    return implode('', $parts);
}

Ответ 19

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

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

Ответ 20

В Laravel используйте Str::camel()

use Illuminate\Support\Str;

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

// fooBar

Ответ 21

Вот небольшая вспомогательная функция, использующая функциональный подход 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);
        }
    );
}

Ответ 22

Попробуйте следующее:

 return preg_replace("/\-(.)/e", "strtoupper('\\1')", $string);

Ответ 23

Это проще:

$string = preg_replace( '/-(.?)/e',"strtoupper('$1')", strtolower( $string ) );