【发布时间】:2025-12-07 21:40:02
【问题描述】:
我想获取这样的字符串:'this-is-a-string' 并将其转换为:'thisIsAString':
function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
// Do stuff
return $string;
}
我需要将“kebab-case”转换为“camelCase”。
【问题讨论】:
我想获取这样的字符串:'this-is-a-string' 并将其转换为:'thisIsAString':
function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
// Do stuff
return $string;
}
我需要将“kebab-case”转换为“camelCase”。
【问题讨论】:
不需要正则表达式或回调。几乎所有的工作都可以用 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 调用之一。
$str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str; 重写条件,主要是为了可读性(尽管有些人可能不同意)和/或降低代码复杂性。
这可以通过使用接受分隔符作为参数的ucwords 非常简单地完成:
function camelize($input, $separator = '_')
{
return str_replace($separator, '', ucwords($input, $separator));
}
注意:至少需要 php 5.4.32、5.5.16
【讨论】:
return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
ucwords 有第二个参数delimiter,所以str_replace("_", "", ucwords($input, "_")); 已经足够好了(在大多数情况下,:P
重载的单行,带有文档块...
/**
* 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的链接
这是我如何处理它的变体。这里我有两个函数,第一个 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;
【讨论】:
camelCase() 函数并不优雅。此页面上还有其他几个更直接/更简洁的答案。有一个本机函数可以替换 strtolower(substr($str,0,1)).substr($str,1)。我不认可一次性变量$i。 [a-zA-Z0-9_] 更简单地写成\w。
我可能会使用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]);
}
【讨论】:
在 Laravel 中使用 Str::camel()
use Illuminate\Support\Str;
$converted = Str::camel('foo_bar');
// fooBar
【讨论】:
你正在寻找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 );
未经测试的代码。查看 PHP 文档中的 im-/explode 和 ucfirst 函数。
【讨论】:
这里是一行代码中非常简单的解决方案
$string='this-is-a-string' ;
echo str_replace('-', '', ucwords($string, "-"));
输出 ThisIsAString
【讨论】:
function camelize($input, $separator = '_')
{
return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
}
echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';
【讨论】:
试试这个:
$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)
重要的是我在示例中使用了蛇案例和骆驼案例的方法
【讨论】:
一个班轮,PHP >= 5.3:
$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));
【讨论】:
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'
这里是方法源代码的链接:
【讨论】:
或者,如果您不想处理正则表达式,并且想要避免 explicit 循环:
// $key = 'some-text', after transformation someText
$key = lcfirst(implode('', array_map(function ($key) {
return ucfirst($key);
}, explode('-', $key))));
【讨论】:
另一种简单的方法:
$nasty = [' ', '-', '"', "'"]; // array of nasty characted to be removed
$cameled = lcfirst(str_replace($nasty, '', ucwords($string)));
【讨论】:
上面有很多好的解决方案,我可以提供一种以前没有人提到过的不同方式。此示例使用数组。我在我的项目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
【讨论】:
这里有一些非常好的解决方案。我将它们编译在一起以便于 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>';
【讨论】:
function camelCase($text) {
return array_reduce(
explode('-', strtolower($text)),
function ($carry, $value) {
$carry .= ucfirst($value);
return $carry;
},
'');
}
显然,如果另一个分隔符不是 '-',例如'_', 也是要匹配的,那么这不起作用,那么 preg_replace 可以先将 $text 中的所有(连续)分隔符转换为 '-'...
【讨论】:
如果你使用 Laravel 框架,你可以只使用 camel_case() 方法。
camel_case('this-is-a-string') // 'thisIsAString'
【讨论】:
这是另一种选择:
private function camelcase($input, $separator = '-')
{
$array = explode($separator, $input);
$parts = array_map('ucwords', $array);
return implode('', $parts);
}
【讨论】:
$stringWithDash = 'Pending-Seller-Confirmation';
$camelize = str_replace('-', '', ucwords($stringWithDash, '-'));
echo $camelize;
输出:PendingSellerConfirmation
ucwords 第二个(可选)参数有助于识别分隔符以将字符串骆驼化。
str_replace 用于通过删除分隔符来完成输出。
【讨论】:
这是一个使用函数式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);
}
);
}
【讨论】:
private function dashesToCamelCase($string)
{
$explode = explode('-', $string);
$return = '';
foreach ($explode as $item) $return .= ucfirst($item);
return lcfirst($return);
}
【讨论】:
在 Yii2 中你可以使用yii\helpers\Inflector::camelize():
use yii\helpers\Inflector;
echo Inflector::camelize("send_email");
// outputs: SendEmail
Yii 提供了很多类似的功能,见the Yii2 Docs。
【讨论】:
试试这个;)
$string = 'this-is-a-string';
$separator = '-';
$stringCamelize = str_replace(
$separator,
'',
lcfirst(
ucwords(
strtolower($string),
$separator
)
)
);
var_dump($stringCamelize); // -> 'thisIsAString'
【讨论】:
试试这个:
return preg_replace("/\-(.)/e", "strtoupper('\\1')", $string);
【讨论】:
这更简单:
$string = preg_replace( '/-(.?)/e',"strtoupper('$1')", strtolower( $string ) );
【讨论】: