在PHP中将Dashes转换为CamelCase

有人可以帮我完成这个PHP函数吗? 我想要这样一个string:'this-is-a-string'并将其转换为:'thisIsAString':

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

没有必要的正则expression式或callback。 几乎所有的工作都可以用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'); 

这可以做到非常简单,使用接受分隔符作为参数的ucwords :

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

注意:需要php至less5.4.32,5.5.16

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

这是我如何处理它的变化。 在这里我有两个函数,第一个是camelCase把任何东西变成了camelCase,如果variables已经包含了cameCase,它就不会混乱。 第二个uncamelCase把camelCase变成下划线(当处理数据库键的时候是很棒的function)。

 function camelCase($str) { $i = array("-","_"); $str = preg_replace('/([az])([AZ])/', "\\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('/([az])([AZ])/', "\\1_\\2", $str); $str = strtolower($str); return $str; } 

让我们testing两个:

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

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

 $camelCase = preg_replace_callback('/-(.?)/', function($matches) { return ucfirst($matches[1]); }, $dashes); 
 $string = explode( "-", $string ); $first = true; foreach( $string as &$v ) { if( $first ) { $first = false; continue; } $v = ucfirst( $v ); } return implode( "", $string ); 

未经testing的代码。 检查PHP文档中的函数im- / explode和ucfirst。

一个class轮,PHP> = 5.3:

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

另外,如果你不想处理正则expression式,并想避免显式循环:

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

重载,但容易阅读,oneliner …

 /** * Convert underscore_strings to camelCase. * * @param {string} $str */ function underscoreToCamel ($str) { // Remove underscores, capitalize words, squash, lowercase first. lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $str)))); } 

尝试这个:

  return preg_replace("/\-(.)/e", "strtoupper('\\1')", $string); 
 function camelCase($text) { return array_reduce( explode('-', strtolower($text)), function ($carry, $value) { $carry .= ucfirst($value); return $carry; }, ''); } 

显然,如果另一个分隔符比' – ',比如'_',也是匹配的,那么这将不起作用,那么preg_replace可以将所有(连续的)分隔符转换为' – ',首先是$文本。

这个function类似于@Svens的function

 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" 

另一种简单的方法

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

一行代码这里是非常非常简单的解决scheme

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

输出 ThisIsAString

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

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

TurboCommons库在StringUtils类中包含一个通用的formatCase()方法,可以将string转换为大量的常见格式,如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' 

这是另一个select:

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

这很简单:

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