将带破折号的字符串转换为驼峰式写法

118
我想把这样的字符串:'this-is-a-string' 转换成 'thisIsAString':
function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
    // Do stuff

    return $string;
}
我需要将“kebab-case”转换为“camelCase”。
30个回答

230

不需要使用正则表达式或回调函数,几乎所有的工作都可以通过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中添加了第二个参数,这意味着我们不需要先将破折号更改为空格(感谢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
如果 $capitalizeFirstCharacter 为假,将字符串 $str 的首字母转换为小写。 - AVProgrammer
3
注意,ucwords实际上接受一个分隔符作为第二个参数(参见PeterM的答案),因此str_replace中的一个调用是不必要的。 - Lars Ebert
感谢@LarsEbert提供的信息。我已经更新了答案。 - webbiedave
条件可以使用三元运算符进行重写,主要是为了提高可读性(尽管有些人可能不同意)和/或减少代码复杂性。$str = !$capitalizeFirstCharacter ? lcfirst($str) : $str; - Chris Athanasiadis

74

这可以非常简单地完成,只需使用ucwords,它接受分隔符作为参数:

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

注意:需要至少 PHP 5.4.32 或 5.5.16。


40
这将返回类似于CamelCase的东西 - 如果你想要类似于camelCase这样的东西,则可以使用以下代码:return str_replace($separator, '', lcfirst(ucwords($input, $separator))); - Jeff S.
ucwords有第二个参数delimiter,所以str_replace("_", "", ucwords($input, "_"));已经足够好了(在大多数情况下,:P)。 - Kacifer
1
为了清晰起见:PeterM的答案将返回大驼峰式大小写(= PascalCase)。Jeff S.的评论将返回小驼峰式大小写(= dromedary case)。 - Daan
无论哪种方式,OP 都需要一个 kebab-case 而不是 snake_case 的解决方案。 - theking2

14

在 Laravel 中使用 Str::camel()

use Illuminate\Support\Str;

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

// fooBar

12

过载的一行代码,带有文档块...

/**
 * 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...已更新,谢谢。这是一个测试链接 https://3v4l.org/YBHPd - doublejosh
我们如何在一行中处理数组? - Hugo-dev
正如本页面其他地方所展示的那样,ucwords()函数不需要在其内部调用str_replace()函数。 - mickmackusa

10
这是我处理它的变体。这里有两个函数,第一个camelCase将任何内容转换为camelCase,并且如果变量已经包含camelCase,则不会出错。第二个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;

该函数返回camelCase的jamesLikesCameAse而不是jamesLikesCameCase。 - Alari Truuts
@Alari,这个演示证明了你的评论是不正确的。请删除你的评论。 - mickmackusa
@mickmackusa 不正确,请再试一次... 哈哈,即使在你的演示中——它也完全按照要求完成了(将带有破折号的字符串转换为驼峰式)。 - Playnox
@Play 你误解了,我支持你的回答。我在要求Alari删除虚假声明/评论。 - mickmackusa
说实话,我觉得你的 camelCase() 函数不够优雅。这个页面上有几个其他答案写得更加直接/简洁。有一个单一的本地函数可以替换 strtolower(substr($str,0,1)).substr($str,1)。我不赞成单独使用变量 $i[a-zA-Z0-9_] 可以更简单地写成 \w - mickmackusa
@mickmackusa 对不起,是我不好... :) 不管怎样(这是在2014年发布的),祝你愉快! - Playnox

6
我会使用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]);
}

5
你需要使用 preg_replace_callback 函数来完成这个任务,你可以按照如下方式使用它:
$camelCase = preg_replace_callback('/-(.?)/', function($matches) {
     return ucfirst($matches[1]);
}, $dashes);

4

试试这个:

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

重要的是这里使用了蛇形命名法和驼峰命名法的方法,示例中保留了 HTML 标签。

1
这是对另一个问题的正确答案。 - mickmackusa
1
重要的是所走的路径,而不是解决方案本身。 - dılo sürücü
camelCase 只在中间有驼峰。StudlyCase 每个单词的首字母都大写。 - mickmackusa
这个迟到的回答只是提供了冗余的建议,可以安全地从页面中删除。 - mickmackusa

4

这里提供了一行非常简单的代码解决方案

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

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

输出 这是一个字符串


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 函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接