在PHP中将Dashs转换为CamelCase


90

有人可以帮助我完成此PHP函数吗?我想要一个这样的字符串:'this-is-a-string'并将其转换为以下内容:'thisIsAString':

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


    return $string;
}

Answers:


182

无需正则表达式或回调。ucword几乎可以完成所有工作:

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中的ucword中添加了第二个参数,这意味着我们不需要首先将破折号更改为空格(感谢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

3
请注意,ucwords实际上接受分隔符作为第二个参数(请参阅PeterM的答案),因此str_replace不需要进行任何调用。
拉尔斯·艾伯特

感谢您提供@LarsEbert信息。我已经更新了答案。
webbiedave

可以使用三元运算符重写条件,$str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;主要是为了提高可读性(尽管有些人可能会不同意)和/或降低代码复杂性。
克里斯·

52

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

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

注意:需要php至少为5.4.32、5.5.16


30
这将返回类似CamelCase的内容-如果您希望它像camelCase那样,则:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.15年

ucwords有第二个参数delimiterstr_replace("_", "", ucwords($input, "_"));就足够了(在大多数情况下,:P
wbswjc

8

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

此函数为camelCase返回jamesLikesCameAse而不是jamesLikesCameCase
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
在那儿放松一下,只是错过了回报。保持乐观。
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

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

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

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

一线,PHP> = 5.3:

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

1
请添加一些说明,这将如何/将有助于OP
davejal

2

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

    $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


1

试试这个:

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

输出:

Snake_Case remove _ with str_replace

1

在Laravel中使用 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;
         },
         '');
}

显然,如果也要匹配除'-'以外的另一个定界符,例如'_',那么它将不起作用,则preg_replace可以先将$ text中的所有(连续的)定界符转换为'-'。


我真的看不出这比4年前提供(并接受)的解决方案更简单,更清晰或更好。
ccjmne 2014年

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

ucwords第二个(可选)参数有助于识别将字符串驼峰化的分隔符。 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


-2

这比较简单:

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

在PHP 5.5中不赞成使用/ e修饰符。
Ondrej Machulda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.