Konwertuj myślniki na CamelCase w PHP

91

Czy ktoś może mi pomóc w wykonaniu tej funkcji PHP? Chcę wziąć ciąg taki jak ten: „this-is-a-string” i przekonwertować go na następujący: „thisIsAString”:

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


    return $string;
}
Kirk Ouimet
źródło

Odpowiedzi:

185

Nie są potrzebne żadne wyrażenia regularne ani wywołania zwrotne. Prawie całą pracę można wykonać za pomocą 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');

Jeśli używasz PHP> = 5.3, możesz użyć lcfirst zamiast strtolower.

Aktualizacja

Drugi parametr został dodany do ucwords w PHP 5.4.32 / 5.5.16, co oznacza, że ​​nie musimy najpierw zamieniać myślników na spacje (dzięki Larsowi Ebertowi i PeterM za zwrócenie na to uwagi). Oto zaktualizowany kod:

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

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

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

    return $str;
}

echo dashesToCamelCase('this-is-a-string');
webbiedave
źródło
18
if (!$capitalizeFirstCharacter) { $str = lcfirst($str); }
AVProgrammer
3
Zauważ, że ucwordsfaktycznie akceptuje separator jako drugi parametr (patrz odpowiedź PeterM ), więc jedno z str_replacewywołań byłoby niepotrzebne.
Lars Ebert,
Dzięki za informację @LarsEbert. Zaktualizowałem odpowiedź.
webbiedave
Warunek można przepisać za pomocą operatora trójskładnikowego, $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;głównie ze względu na czytelność (choć niektórzy mogą się nie zgadzać) i / lub zmniejszenie złożoności kodu.
Chris Athanasiadis
54

Można to zrobić bardzo prosto, używając ucwords, który akceptuje separator jako parametr:

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

UWAGA: Potrzebujesz php co najmniej 5.4.32, 5.5.16

PeterM
źródło
33
To zwróci coś w rodzaju CamelCase - jeśli chcesz, aby to było coś w rodzaju camelCase, to:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.
ucwordsma drugi parametr delimiter, więc str_replace("_", "", ucwords($input, "_"));jest wystarczająco dobry (w większości przypadków: P
wbswjc
8

to moja odmiana tego, jak sobie z tym poradzić. Tutaj mam dwie funkcje, pierwsza camelCase zamienia wszystko w camelCase i nie będzie bałaganu, jeśli zmienna już zawiera cameCase. Drugi uncamelCase zamienia camelCase w podkreślenie (świetna funkcja w przypadku kluczy bazy danych).

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;
}

przetestujmy oba:

$camel = camelCase("James_LIKES-camelCase");
$uncamel = uncamelCase($camel);
echo $camel." ".$uncamel;
Playnox
źródło
Ta funkcja zwraca jamesLikesCameAse dla camelCase zamiast jamesLikesCameCase
Alari Truuts
8

Przeciążona jedna linijka, z blokiem dokumentów ...

/**
 * 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))));
}
doublejosh
źródło
To powrócinull
PeterM
Brakowało funkcji return... zaktualizowana, dzięki. Oto link do przetestowania tego 3v4l.org/YBHPd
doublejosh
6
Spokojnie, kolego, właśnie przegapiłem powrót. Miej pozytywne nastawienie do SO.
doublejosh
5

Prawdopodobnie użyłbym preg_replace_callback()tak:

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

function removeDashAndCapitalize($matches) {
  return strtoupper($matches[0][1]);
}
Jeremy Ruten
źródło
4

Szukasz preg_replace_callback , możesz go użyć w ten sposób:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) {
     return ucfirst($matches[1]);
}, $dashes);
Sparkup
źródło
4
function camelize($input, $separator = '_')
{
    return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
}

echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';
Błażej Krzakala
źródło
3
$string = explode( "-", $string );
$first = true;
foreach( $string as &$v ) {
    if( $first ) {
        $first = false;
        continue;
    }
    $v = ucfirst( $v );
}
return implode( "", $string );

Niesprawdzony kod. Sprawdź w dokumentacji PHP funkcje im- / explode i ucfirst.

svens
źródło
3

Jedna linijka, PHP> = 5.3:

$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));
Tim
źródło
1
proszę dodać wyjaśnienie, jak to może / pomoże OP
davejal
2

tutaj jest bardzo proste rozwiązanie w kodzie jednowierszowym

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

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

wyjście ThisIsAString

Abbbas khan
źródło
1

Alternatywnie, jeśli wolisz nie zajmować się wyrażeniami regularnymi i chcesz uniknąć jawnych pętli:

// $key = 'some-text', after transformation someText            
$key = lcfirst(implode('', array_map(function ($key) {
    return ucfirst($key);
}, explode('-', $key))));
Victor Farazdagi
źródło
1

Kolejne proste podejście:

$nasty = [' ', '-', '"', "'"]; // array of nasty characted to be removed
$cameled = lcfirst(str_replace($nasty, '', ucwords($string)));
Panie Sorbose
źródło
1

Biblioteka TurboCommons 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:

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

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

// will output 'sNakeCase'

Oto link do kodu źródłowego metody:

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

Jaume Mussons Abad
źródło
1

Spróbuj tego:

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

Wynik:

Snake_Case remove _ with str_replace
dılo sürücü
źródło
1

W Laravel użyj Str::camel()

use Illuminate\Support\Str;

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

// fooBar
Ronald Araújo
źródło
0
function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

Oczywiście, jeśli inny separator niż '-', np. '_', Również ma być dopasowany, to nie zadziała, wtedy preg_replace może najpierw zamienić wszystkie (kolejne) separatory na '-' w $ text ...

PeerGum
źródło
Naprawdę nie rozumiem, jak to jest prostsze, jaśniejsze lub w każdym razie lepsze niż rozwiązanie dostarczone (i zaakceptowane) około 4 lata temu.
ccjmne
0

Ta funkcja jest podobna do funkcji @ 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);
}

Ale jaśniej (myślę: D) i z opcjonalnym parametrem, aby pierwsza litera była wielka lub nie.

Stosowanie:

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

var_dump($ex1);
//string(21) "functionTestCamelCase"
var_dump($ex2);
//string(21) "FunctionTestCamelCase"
Felipe Nascimento
źródło
0

Jeśli używasz frameworka Laravel, możesz użyć po prostu metody camel_case () .

camel_case('this-is-a-string') // 'thisIsAString'
Marek Skiba
źródło
0

Oto inna opcja:

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

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

    return implode('', $parts);
}
Mariano Echeverría
źródło
0

$stringWithDash = 'Pending-Seller-Confirmation'; $camelize = str_replace('-', '', ucwords($stringWithDash, '-')); echo $camelize; dane wyjściowe: PendingSellerConfirmation

ucwordsdrugi (opcjonalny) parametr pomaga w identyfikacji separatora do kamelizacji łańcucha. str_replacesłuży do sfinalizowania wydruku poprzez usunięcie separatora.

RT
źródło
0

Oto mała funkcja pomocnicza wykorzystująca podejście funkcjonalne array_reduce . Wymaga co najmniej 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
źródło
0

Wiele dobrych rozwiązań powyżej i mogę podać inny sposób, o którym nikt wcześniej nie wspominał. W tym przykładzie użyto array. Używam tej metody w moim projekcie 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;
}

Sprawdź to:

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

Wynik:

ThisIsExample
Terry Lin
źródło
-2

To jest prostsze:

$string = preg_replace( '/-(.?)/e',"strtoupper('$1')", strtolower( $string ) );
snwalkunde
źródło
Modyfikator / e jest przestarzały w PHP 5.5.
Ondrej Machulda