Convertir Guiones a CamelCase en PHP

91

¿Alguien puede ayudarme a completar esta función de PHP? Quiero tomar una cadena como esta: 'this-is-a-string' y convertirla a esto: 'thisIsAString':

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


    return $string;
}
Kirk Ouimet
fuente

Respuestas:

185

No se necesitan expresiones regulares ni devoluciones de llamada. Casi todo el trabajo se puede hacer con 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');

Si está usando PHP> = 5.3, puede usar lcfirst en lugar de strtolower.

Actualizar

Se agregó un segundo parámetro a ucwords en PHP 5.4.32 / 5.5.16, lo que significa que no necesitamos cambiar primero los guiones a espacios (gracias a Lars Ebert y PeterM por señalar esto). Aquí está el código actualizado:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) 
{

    $str = str_replace('-', '', ucwords($string, '-'));

    if (!$capitalizeFirstCharacter) {
        $str = lcfirst($str);
    }

    return $str;
}

echo dashesToCamelCase('this-is-a-string');
webbiedave
fuente
18
if (!$capitalizeFirstCharacter) { $str = lcfirst($str); }
AVProgrammer
3
Tenga en cuenta que en ucwordsrealidad acepta un delimitador como segundo parámetro (consulte la respuesta de PeterM ), por lo que una de las str_replacellamadas sería innecesaria.
Lars Ebert
Gracias por la información @LarsEbert. Actualicé la respuesta.
webbiedave
La condición se puede reescribir con el uso del operador ternario $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str;principalmente para facilitar la lectura (aunque algunos pueden no estar de acuerdo) y / o reducir la complejidad del código.
Chris Athanasiadis
55

Esto se puede hacer de manera muy simple, usando ucwords que acepta delimitadores como parámetro:

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

NOTA: Necesita php al menos 5.4.32, 5.5.16

PeterM
fuente
33
Esto devolverá algo como CamelCase; si quieres que sea algo como camelCase, entonces:return str_replace($separator, '', lcfirst(ucwords($input, $separator)));
Jeff S.
ucwordstiene un segundo parámetro delimiter, por lo que str_replace("_", "", ucwords($input, "_"));es suficientemente bueno (en la mayoría de los casos
,:
8

esta es mi variación sobre cómo lidiar con eso. Aquí tengo dos funciones, primero una camelCase convierte cualquier cosa en una camelCase y no se ensuciará si la variable ya contiene cameCase. El segundo uncamelCase convierte camelCase en un guión bajo (gran característica cuando se trata de claves de bases de datos).

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;
}

vamos a probar ambos:

$camel = camelCase("James_LIKES-camelCase");
$uncamel = uncamelCase($camel);
echo $camel." ".$uncamel;
Playnox
fuente
Esta función devuelve jamesLikesCameAse para camelCase en lugar de jamesLikesCameCase
Alari Truuts
8

One-liner sobrecargado, con doc block ...

/**
 * 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))));
}
doublejosh
fuente
Esto volveránull
PeterM
La función faltaba un return... actualizado, gracias. Aquí hay un enlace para probar esto 3v4l.org/YBHPd
doublejosh
6
Tranquilo, amigo, solo perdí el regreso. Mantente positivo en SO.
doublejosh
5

Probablemente usaría preg_replace_callback(), así:

function dashesToCamelCase($string, $capitalizeFirstCharacter = false) {
  return preg_replace_callback("/-[a-zA-Z]/", 'removeDashAndCapitalize', $string);
}

function removeDashAndCapitalize($matches) {
  return strtoupper($matches[0][1]);
}
Jeremy Ruten
fuente
4

Estás buscando preg_replace_callback , puedes usarlo así:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) {
     return ucfirst($matches[1]);
}, $dashes);
Encender
fuente
4
function camelize($input, $separator = '_')
{
    return lcfirst(str_replace($separator, '', ucwords($input, $separator)));
}

echo ($this->camelize('someWeir-d-string'));
// output: 'someWeirdString';
Błażej Krzakala
fuente
3
$string = explode( "-", $string );
$first = true;
foreach( $string as &$v ) {
    if( $first ) {
        $first = false;
        continue;
    }
    $v = ucfirst( $v );
}
return implode( "", $string );

Código no probado. Consulte los documentos de PHP para las funciones im- / explode y ucfirst.

svens
fuente
3

Una línea, PHP> = 5.3:

$camelCase = lcfirst(join(array_map('ucfirst', explode('-', $url))));
Tim
fuente
1
por favor agregue alguna explicación de cómo esto puede / ayudará al OP
davejal
2

aquí hay una solución muy, muy fácil en un código de una línea

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

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

salida ThisIsAString

Abbas Khan
fuente
1

Alternativamente, si prefiere no lidiar con expresiones regulares y desea evitar bucles explícitos :

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

Otro enfoque simple:

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

La biblioteca de TurboCommons contiene un método formatCase () de propósito general dentro de la clase StringUtils, que le permite convertir una cadena a muchos formatos de casos comunes, como CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Title Case y muchos más.

https://github.com/edertone/TurboCommons

Para usarlo, importe el archivo phar a su proyecto y:

use org\turbocommons\src\main\php\utils\StringUtils;

echo StringUtils::formatCase('sNake_Case', StringUtils::FORMAT_CAMEL_CASE);

// will output 'sNakeCase'

Aquí está el enlace al código fuente del método:

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

Jaume Mussons Abad
fuente
1

Prueba esto:

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

Salida:

Snake_Case remove _ with str_replace
dılo sürücü
fuente
1

En uso de Laravel Str::camel()

use Illuminate\Support\Str;

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

// fooBar
Ronald Araújo
fuente
0
function camelCase($text) {
    return array_reduce(
         explode('-', strtolower($text)),
         function ($carry, $value) {
             $carry .= ucfirst($value);
             return $carry;
         },
         '');
}

Obviamente, si otro delimitador que '-', por ejemplo, '_', también debe coincidir, esto no funcionará, entonces un preg_replace podría convertir todos los delimitadores (consecutivos) a '-' en $ text primero ...

PeerGum
fuente
Realmente no veo cómo esto es más simple, más claro o mejor que la solución proporcionada (y aceptada) hace unos 4 años.
ccjmne
0

Esta función es similar a la función de @ 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);
}

Pero más claro, (creo: D) y con el parámetro opcional de poner en mayúscula la primera letra o no.

Uso:

$dashes = 'function-test-camel-case';
$ex1 = toCamelCase($dashes);
$ex2 = toCamelCase($dashes, true);

var_dump($ex1);
//string(21) "functionTestCamelCase"
var_dump($ex2);
//string(21) "FunctionTestCamelCase"
Felipe Nascimento
fuente
0

Si usa el framework Laravel, puede usar solo el método camel_case () .

camel_case('this-is-a-string') // 'thisIsAString'
Marek Skiba
fuente
0

Aquí tienes otra opción:

private function camelcase($input, $separator = '-')     
{
    $array = explode($separator, $input);

    $parts = array_map('ucwords', $array);

    return implode('', $parts);
}
Mariano Echeverría
fuente
0

$stringWithDash = 'Pending-Seller-Confirmation'; $camelize = str_replace('-', '', ucwords($stringWithDash, '-')); echo $camelize; salida: PendingSellerConfirmation

ucwordsEl segundo parámetro (opcional) ayuda a identificar un separador para camelizar la cadena. str_replacese utiliza para finalizar la salida quitando el separador.

RT
fuente
0

Aquí hay una pequeña función auxiliar que utiliza un enfoque funcional array_reduce . Requiere al menos 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);
        }
    );
}
cb0
fuente
0

Muchas buenas soluciones anteriores, y puedo proporcionar una forma diferente que nadie mencionó antes. Este ejemplo usa array. Utilizo este método en mi proyecto 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;
}

Pruébalo:

echo getCamelCase('This-is-example');

Resultado:

ThisIsExample
Terry Lin
fuente
-1

Prueba esto:

 return preg_replace("/\-(.)/e", "strtoupper('\\1')", $string);
Jakub Hampl
fuente
2
El modificador / e está obsoleto en PHP 5.5.
Ondrej Machulda
1
Más información sobre lae
desactivación del
-2

Esto es más simple:

$string = preg_replace( '/-(.?)/e',"strtoupper('$1')", strtolower( $string ) );
snwalkunde
fuente
El modificador / e está obsoleto en PHP 5.5.
Ondrej Machulda