【问题标题】:Convert string with dashes to camelCase将带破折号的字符串转换为 camelCase
【发布时间】:2025-12-07 21:40:02
【问题描述】:

我想获取这样的字符串:'this-is-a-string' 并将其转换为:'thisIsAString':

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

    return $string;
}

我需要将“kebab-case”转换为“camelCase”。

【问题讨论】:

    标签: php string


    【解决方案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。

    更新

    在 PHP 5.4.32/5.5.16 中向 ucwords 添加了第二个参数,这意味着我们不需要先将破折号更改为空格(感谢 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');
    

    【讨论】:

    • if (!$capitalizeFirstCharacter) { $str = lcfirst($str); }
    • 请注意,ucwords 实际上接受分隔符作为第二个参数(请参阅answer by PeterM),因此不需要str_replace 调用之一。
    • 感谢@LarsEbert 提供的信息。我已经更新了答案。
    • 可以使用三元运算符$str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str; 重写条件,主要是为了可读性(尽管有些人可能不同意)和/或降低代码复杂性。
    【解决方案2】:

    这可以通过使用接受分隔符作为参数的ucwords 非常简单地完成:

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

    注意:至少需要 php 5.4.32、5.5.16

    【讨论】:

    • 这将返回类似 CamelCase 的东西 - 如果你希望它是类似 camelCase 的东西,那么:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
    • ucwords 有第二个参数delimiter,所以str_replace("_", "", ucwords($input, "_")); 已经足够好了(在大多数情况下,:P
    • 为清楚起见:PeterM 的答案将返回 大写驼峰式 (= PascalCase)。 Jeff S. 的评论将返回lower camel case(= dromedary case)。
    • 不管怎样。 OP 需要 kebab-case 而不是 snake_case 的解决方案。
    【解决方案3】:

    重载的单行,带有文档块...

    /**
     * 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
    • 该功能缺少return ...已更新,谢谢。这是一个测试这个3v4l.org/YBHPd的链接
    • 如何在一行中处理一个数组?
    【解决方案4】:

    这是我如何处理它的变体。这里我有两个函数,第一个 camelCase 将任何东西变成一个 cameCase,如果变量已经包含 cameCase,它就不会乱了。第二个 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;
    

    【讨论】:

    • 这个函数返回 jamesLikesCameAse for camelCase 而不是 jamesLikesCameCase
    • @Alari this demo 证明您的评论不正确。请删除您的评论。
    • @mickmackusa 不正确,请再试一次...大声笑,即使在您的演示中 - 它完全符合要求(将带有破折号的字符串转换为驼峰式)
    • @Play 你误会了,我支持你的回答。我要求 Alari 删除虚假声明/评论。
    • 老实说,我觉得你的camelCase() 函数并不优雅。此页面上还有其他几个更直接/更简洁的答案。有一个本机函数可以替换 strtolower(substr($str,0,1)).substr($str,1)。我不认可一次性变量$i[a-zA-Z0-9_] 更简单地写成\w
    【解决方案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】:

      在 Laravel 中使用 Str::camel()

      use Illuminate\Support\Str;
      
      $converted = Str::camel('foo_bar');
      
      // fooBar
      

      【讨论】:

        【解决方案7】:

        你正在寻找preg_replace_callback,你可以这样使用它:

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

        【讨论】:

          【解决方案8】:
          $string = explode( "-", $string );
          $first = true;
          foreach( $string as &$v ) {
              if( $first ) {
                  $first = false;
                  continue;
              }
              $v = ucfirst( $v );
          }
          return implode( "", $string );
          

          未经测试的代码。查看 PHP 文档中的 im-/explode 和 ucfirst 函数。

          【讨论】:

            【解决方案9】:

            这里是一行代码中非常简单的解决方案

                $string='this-is-a-string' ;
            
               echo   str_replace('-', '', ucwords($string, "-"));
            

            输出 ThisIsAString

            【讨论】:

              【解决方案10】:
              function camelize($input, $separator = '_')
              {
                  return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
              }
              
              echo ($this->camelize('someWeir-d-string'));
              // output: 'someWeirdString';
              

              【讨论】:

              • 不完整和不正确的代码。请在发布前进行测试。
              • 我同意这不是一个有效的演示。这会让研究人员感到困惑。再加上这个通用技术在这个页面的前面就已经存在了。我没有找到这个答案来为这个页面添加任何新值。
              【解决方案11】:

              试试这个:

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

              输出:

              Snake_Case 
              

              用 str_replace 删除 _

               str_replace('_','',$ucword); //SnakeCase
              
              

              结果

               $result='SnakeCase';  //pascal case
               echo lcfirst('SnakeCase');  //snakeCase (camel case)
              

              重要的是我在示例中使用了蛇案例和骆驼案例的方法

              【讨论】:

              • 这是另一个问题的正确答案。
              • 走的路很重要,而不是解决方案本身
              • camelCase 中间只有驼峰。 StudlyCase 以大写字母开头每个单词。
              【解决方案12】:

              一个班轮,PHP >= 5.3:

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

              【讨论】:

              • 请添加一些解释这如何/将如何帮助 OP
              • 这是@Victor 答案的精简版。
              【解决方案13】:

              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

              【讨论】:

                【解决方案14】:

                或者,如果您不想处理正则表达式,并且想要避免 explicit 循环:

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

                【讨论】:

                  【解决方案15】:

                  另一种简单的方法:

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

                  【讨论】:

                    【解决方案16】:

                    上面有很多好的解决方案,我可以提供一种以前没有人提到过的不同方式。此示例使用数组。我在我的项目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
                    

                    【讨论】:

                    • 差不多。严格来说,这是 PascalCase 而不是 camelCase。但是我们将正确的解决方案留作练习......
                    【解决方案17】:

                    这里有一些非常好的解决方案。我将它们编译在一起以便于 c&p

                    declare(strict_types=1);
                    /**
                     * convert kebab-case to PascalCase
                     */
                    function kebabToPascal( string $str ): string {
                       return str_replace( ' ', '', ucwords( str_replace( '-', ' ', $str ) ) );
                    }
                    
                    /**
                     * convert snake_case to PascalCase
                     */
                    function snakeToPascal( string $str ): string {
                      return str_replace (' ', '', ucwords( str_replace( '_', ' ', $str ) ) );
                    }
                    
                    /**
                      * convert snake_case to camelCase
                      */
                     function snakeToCamel( string $str ): string {
                      return lcfirst( snakeToPascal( $str ) );
                    }
                    
                    /**
                     * convert kebab-case to camelCase
                     */
                    function kebabToCamel( string $str): string {
                      return lcfirst( kebabToPascal( $str ) );
                    }
                    
                    
                    
                    echo snakeToCamel( 'snake_case' ). '<br>';
                    echo kebabToCamel( 'kebab-case' ). '<br>';
                    echo snakeToPascal( 'snake_case' ). '<br>';
                    echo kebabToPascal( 'kebab-case' ). '<br>';
                    
                    echo kebabToPascal( 'It will BREAK on things-like_this' ). '<br>';
                    

                    【讨论】:

                      【解决方案18】:
                      function camelCase($text) {
                          return array_reduce(
                               explode('-', strtolower($text)),
                               function ($carry, $value) {
                                   $carry .= ucfirst($value);
                                   return $carry;
                               },
                               '');
                      }
                      

                      显然,如果另一个分隔符不是 '-',例如'_', 也是要匹配的,那么这不起作用,那么 preg_replace 可以先将 $text 中的所有(连续)分隔符转换为 '-'...

                      【讨论】:

                      • 我真的不明白这比大约 4 年前提供(和接受)的解决方案更简单、更清晰或无论如何更好。
                      【解决方案19】:

                      如果你使用 Laravel 框架,你可以只使用 camel_case() 方法。

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

                      【讨论】:

                        【解决方案20】:

                        这是另一种选择:

                        private function camelcase($input, $separator = '-')     
                        {
                            $array = explode($separator, $input);
                        
                            $parts = array_map('ucwords', $array);
                        
                            return implode('', $parts);
                        }
                        

                        【讨论】:

                        • Victor 和@Tim 已经提出了这一系列技术(并通过小写第一个字母完成)。
                        【解决方案21】:

                        $stringWithDash = 'Pending-Seller-Confirmation'; $camelize = str_replace('-', '', ucwords($stringWithDash, '-')); echo $camelize; 输出:PendingSellerConfirmation

                        ucwords 第二个(可选)参数有助于识别分隔符以将字符串骆驼化。 str_replace 用于通过删除分隔符来完成输出。

                        【讨论】:

                          【解决方案22】:

                          这是一个使用函数式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);
                                  }
                              );
                          }
                          

                          【讨论】:

                            【解决方案23】:
                            private function dashesToCamelCase($string)
                            {
                                $explode = explode('-', $string);
                                $return = '';
                                foreach ($explode as $item) $return .= ucfirst($item);
                            
                                return lcfirst($return);
                            }
                            

                            【讨论】:

                              【解决方案24】:

                              在 Yii2 中你可以使用yii\helpers\Inflector::camelize():

                              use yii\helpers\Inflector;
                              
                              echo Inflector::camelize("send_email");
                              
                              // outputs: SendEmail
                              

                              Yii 提供了很多类似的功能,见the Yii2 Docs

                              【讨论】:

                                【解决方案25】:

                                试试这个;)

                                $string = 'this-is-a-string';
                                $separator = '-';
                                
                                $stringCamelize = str_replace(
                                    $separator,
                                    '',
                                    lcfirst(
                                        ucwords(
                                            strtolower($string),
                                            $separator
                                        )
                                    )
                                );
                                
                                var_dump($stringCamelize); // -> 'thisIsAString'
                                

                                【讨论】:

                                  【解决方案26】:

                                  试试这个:

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

                                  【讨论】:

                                  【解决方案27】:

                                  这更简单:

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

                                  【讨论】:

                                  • /e 修饰符在 PHP 5.5 中已弃用。