PHPでダッシュをキャメルケースに変換


91

誰かがこのPHP関数の完成を手伝ってくれる?次のような文字列を取得したい: 'this-is-a-string'に変換します: 'thisIsAString':

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


    return $string;
}

回答:


183

正規表現やコールバックは必要ありません。ほとんどすべての作業は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を使用している場合は、strtolowerの代わりにlcfirstを使用できます。

更新

PHP 5.4.32 / 5.5.16のucwordsに2番目のパラメーターが追加されました。これは、最初にダッシュをスペースに変更する必要がないことを意味します(これを指摘してくれた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');

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

3
ucwords2番目のパラメーターとして実際に区切り文字を受け入れることに注意してください(PeterMによる回答を参照)。したがって、str_replace呼び出しの1つは不要になります。
Lars Ebert

情報@LarsEbertをありがとう。答えを更新しました。
webbiedave 2017

条件は、$str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;主に読みやすさ(一部は異なる場合があります)やコードの複雑さを軽減するために、3項演算子を使用して書き換えることができます。
Chris Athanasiadis

52

これは、区切り文字をパラメーターとして受け入れるucwordsを使用することにより、非常に簡単に行うことができます。

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

注:少なくとも5.4.32、5.5.16のphpが必要です


30
これはCamelCaseのようなものを返します-これをcamelCaseのようなものにしたい場合:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.

ucwords2番目のパラメーターdelimiterがあるのでstr_replace("_", "", ucwords($input, "_"));十分です(ほとんどの場合、:P
wbswjc

8

これは私の対処方法のバリエーションです。ここには2つの関数があります。最初の1つはcamelCaseが何かをcamelCaseに変換します。変数にすでにcameCaseが含まれていても問題はありません。2番目の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;

この関数は、jamesLikesCameCaseではなくcamelCaseに対してjamesLikesCameAseを返します
Alari Truuts

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

1つのライナー、PHP> = 5.3:

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

1
これがOPにどのように役立つか、またはどのように役立つかについて説明を追加してください
davejal

2

ここに、1行のコードで非常に簡単な解決策があります

    $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ライブラリには、StringUtilsクラス内に汎用のformatCase()メソッドが含まれています。これにより、文字列を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




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

明らかに、「-」以外の区切り文字、たとえば「_」も一致させる場合、これは機能せず、preg_replaceはすべての(連続する)区切り文字を最初に$ textの「-」に変換できます...


これが約4年前に提供された(そして受け入れられた)ソリューションよりも単純で、明確で、どうにか優れているかは、私にはよくわかりません。
ccjmne 14

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

ここに別のオプションがあります:

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

ucwordssecond(オプション)パラメータは、文字列をキャメル化するためのセパレータを識別するのに役立ちます。 str_replaceセパレータを削除して出力を完成させるために使用されます。


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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.