繁体   English   中英

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

[英]Convert string with dashes to 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');

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

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

注意:需要 php 至少 5.4.32、5.5.16

超载单行,带有文档块...

/**
 * 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))));
}

这是我如何处理它的变化。 这里我有两个函数,第一个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;

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

您正在寻找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';

在 Laravel 中使用Str::camel()

use Illuminate\Support\Str;

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

// fooBar

一个班轮,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'

这是方法源代码的链接:

https://github.com/edertone/TurboCommons/blob/b2e015cf89c8dbe372a5f5515e7d9763f45eba76/TurboCommons-Php/src/main/php/utils/StringUtils.php#L653

尝试这个:

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

输出:

Snake_Case 

用 str_replace 删除 _

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

和结果

SnakeCase

尝试这个 ;)

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

$stringCamelize = str_replace(
    $separator,
    '',
    lcfirst(
        ucwords(
            strtolower($string),
            $separator
        )
    )
);

var_dump($stringCamelize); // -> 'thisIsAString'

或者,如果您不想处理正则表达式,并希望避免显式循环:

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

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

use yii\helpers\Inflector;

echo Inflector::camelize("send_email");

// outputs: SendEmail

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

function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

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

此功能类似于@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"

如果你使用 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);
}

这里有一些非常好的解决方案。 我将它们编译在一起以方便 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($string){
    $chunks = preg_split("/\s+|-|_/",$string);

    $camel = "";
        
    foreach ($chunks as $idx => $chunk){
         
        if ($idx===0){
            $camel = strtolower($chunk);
        }else{
                $camel .= ucfirst($chunk);
        }
    }
    return $camel;
}

最短和最优雅的解决方案是:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
    $result = join("", array_map("ucfirst", explode("-", $string)));

    if ($capitalizeFirstCharacter === false) {
        return lcfirst($result);
    }

    return $result;
}

一条线选项

echo str_replace(' ', '', lcfirst(ucwords(str_replace("_", " ", 'facebook_catalog_id_type')))); 
//output: facebookCatalogIdType

尝试这个:

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

这更简单:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM