Çizgileri PHP'de CamelCase'e Dönüştür


91

Birisi bu PHP işlevini tamamlamama yardım edebilir mi? Şöyle bir dizge almak istiyorum: 'this-is-a-string' ve bunu şuna dönüştürmek istiyorum: 'thisIsAString':

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


    return $string;
}

Yanıtlar:


185

Normal ifade veya geri arama gerekmez. Hemen hemen tüm iş ucwords ile yapılabilir:

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 kullanıyorsanız, strtolower yerine lcfirst kullanabilirsiniz.

Güncelleme

PHP 5.4.32 / 5.5.16'da ucwords'e ikinci bir parametre eklendi, bu da ilk önce çizgileri boşluk olarak değiştirmemize gerek olmadığı anlamına geliyor (bunu işaret ettiği için Lars Ebert ve PeterM'ye teşekkürler). İşte güncellenmiş kod:

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

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

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

    return $str;
}

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

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

3
ucwordsİkinci parametre olarak bir sınırlayıcıyı kabul ettiğine dikkat edin ( PeterM'nin cevabına bakın ), bu nedenle str_replaceçağrılardan biri gereksiz olacaktır.
Lars Ebert

@LarsEbert bilgisi için teşekkürler. Cevabı güncelledim.
webbiedave

Koşul, üçlü operatörün $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;temel olarak okunabilirlik için (bazıları aynı fikirde olmasa da) ve / veya kod karmaşıklığını azaltarak yeniden yazılabilir .
Chris Athanasiadis

55

Bu, ayırıcıyı param olarak kabul eden ucwords kullanılarak çok basit bir şekilde yapılabilir :

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

NOT: En az 5.4.32, 5.5.16 php'ye ihtiyacınız var


33
Bu, CamelCase gibi bir şey döndürecektir - eğer bunun camelCase gibi bir şey olmasını istiyorsanız:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.

ucwordsikinci bir parametreye sahiptir delimiter, bu yüzden str_replace("_", "", ucwords($input, "_"));yeterince iyidir (çoğu durumda
,:

8

bu benim onunla nasıl başa çıkılacağına dair varyasyonum. Burada iki işlevi, ilki var camelCase bir CamelCase içine dönüşler şey ve değişken zaten cameCase içeren bu alışkanlık karışıklık eğer. İkinci uncamelCase , camelCase'i alt çizgiye dönüştürür (veritabanı anahtarlarıyla uğraşırken harika bir özellik).

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

ikisini de test edelim:

$camel = camelCase("James_LIKES-camelCase");
$uncamel = uncamelCase($camel);
echo $camel." ".$uncamel;

Bu işlev, jamesLikesCameCase yerine camelCase için jamesLikesCameAse döndürür
Alari Truuts

8

Belge bloğu ile tek astarlı aşırı yüklenmiş ...

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

Bu geri döneceknull
PeterM

İşlevde bir eksikti return... güncellendi, teşekkürler. İşte bu 3v4l.org/YBHPd'yi
doublejosh

6
Orada sakin ol dostum, dönüşü kaçırdım. SO konusunda pozitif kalın.
doublejosh

5

Muhtemelen şöyle kullanırdım 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
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 );

Test edilmemiş kod. İm- / explode ve ucfirst işlevleri için PHP belgelerine bakın.


3

Bir satır, PHP> = 5.3:

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

1
lütfen bunun
OP'ye

2

işte tek satırlık kodda çok çok kolay çözüm

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

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

çıktı ThisIsAString


1

Alternatif olarak, normal ifadeyle uğraşmamayı tercih ediyorsanız ve açık döngülerden kaçınmak istiyorsanız :

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

1

Başka bir basit yaklaşım:

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

1

TurboCommons kitaplığı, StringUtils sınıfı içinde genel amaçlı bir formatCase () yöntemi içerir; bu, bir dizeyi CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case ve daha birçok yaygın durum biçimine dönüştürmenize olanak tanır.

https://github.com/edertone/TurboCommons

Kullanmak için phar dosyasını projenize aktarın ve:

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

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

// will output 'sNakeCase'

Yöntem kaynak kodunun bağlantısı şu şekildedir:

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


1

Bunu dene:

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

Çıktı:

Snake_Case remove _ with str_replace

1

Laravel kullanımında 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;
         },
         '');
}

Açıkçası, '-' dışında başka bir sınırlayıcı, örneğin '_' ile de eşleştirilecekse, bu işe yaramaz, o zaman bir preg_replace tüm (ardışık) sınırlayıcıları önce $ metin içinde '-' olarak dönüştürebilir ...


Bunun, yaklaşık 4 yıl önce sağlanan (ve kabul edilen) çözümden ne kadar daha basit, daha net veya daha iyi olduğunu gerçekten anlamıyorum.
ccjmne

0

Bu işlev, @ Svens'in işlevine benzer

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

Ama daha net, (sanırım: D) ve isteğe bağlı parametre ile ilk harfin büyük harfle yazılması ya da yazılmaması.

Kullanım:

$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 framework kullanıyorsanız, sadece camel_case () metodunu kullanabilirsiniz.

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

0

İşte başka bir seçenek:

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; çıktı: PendingSellerConfirmation

ucwordsikinci (isteğe bağlı) parametre, dizeyi deve haline getirmek için bir ayırıcının tanımlanmasına yardımcı olur. str_replaceayırıcıyı kaldırarak çıktıyı sonlandırmak için kullanılır.


0

Burada, işlevsel bir dizi_ azaltma yaklaşımı kullanan küçük bir yardımcı işlev verilmiştir . En az PHP 7.0 gerektirir

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

0

Yukarıdaki birçok iyi çözüm ve daha önce kimsenin bahsetmediği farklı bir yol sağlayabilirim. Bu örnek dizi kullanır. Bu yöntemi Shieldon Firewall projemde kullanıyorum .

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

Dene:

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

Sonuç:

ThisIsExample


-2

Bu daha basit:

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

/ E değiştiricisi PHP 5.5'te kullanımdan kaldırılmıştır.
Ondrej Machulda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.