Convertir cadena con guiones a camelCase

4 minutos de lectura

avatar de usuario
kirk oumet

Quiero tomar una cadena como esta: ‘this-is-a-string’ y convertirla en esto: ‘thisIsAString’:

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

    return $string;
}

Necesito convertir “kebab-case” a “camelCase”.

avatar de usuario
webbiedave

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');

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

    – Programador AV

    19 de julio de 2013 a las 6:51

  • Tenga en cuenta que ucwords en realidad acepta un delimitador como segundo parámetro (ver respuesta de PeterM), por lo que uno de los str_replace las llamadas serían innecesarias.

    – Lars Ebert

    14 de febrero de 2017 a las 12:14

  • Gracias por la información @LarsEbert. He actualizado la respuesta.

    – webbiedave

    16 de febrero de 2017 a las 23:08

  • La condición se puede reescribir con el uso del operador ternario $str = ! $capitalizeFirstCharacter ? lcfirst($str) : $str; principalmente por la legibilidad (aunque algunos pueden no estar de acuerdo) y/o la reducción de la complejidad del código.

    – Chris Athanasiadis

    27 de mayo de 2020 a las 7:38

avatar de usuario
PedroM

Esto se puede hacer de manera muy simple, usando palabras que acepta delimitador 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

  • Esto devolverá algo como CamelCase; si quieres que sea algo como camelCase, entonces: return str_replace($separator, '', lcfirst(ucwords($input, $separator)));

    –Jeff S.

    16 de noviembre de 2015 a las 4:09


  • ucwords tiene un segundo parámetro delimiterasi que str_replace("_", "", ucwords($input, "_")); es lo suficientemente bueno (en la mayoría de los casos, 😛

    – caracol

    23 de mayo de 2017 a las 8:42

  • Para mayor claridad: la respuesta de PeterM volverá caja de camello superior (= Caso Pascal). Volverá el comentario de Jeff S. caja de camello inferior (= caso de dromedario).

    – Daan

    18 de mayo de 2021 a las 8:02


  • De todas formas. El OP necesitaba una solución para kebab-case, no para snake_case.

    – el rey2

    19 de septiembre de 2021 a las 9:54

avatar de usuario
doblejosh

Overloaded one-liner, 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))));
}

  • esto regresará null

    – Pedro M

    9 de enero de 2018 a las 18:29

  • La función carecía de return … actualizado, gracias. Aquí hay un enlace para probar esto 3v4l.org/YBHPd

    – doble josh

    10 de enero de 2018 a las 23:06

  • ¿Cómo podemos procesar una matriz en una línea?

    – Hugo-dev

    14 dic 2021 a las 19:32

esta es mi variación sobre cómo lidiar con eso. Aquí tengo dos funciones, la primera el caso de Carmel convierte cualquier cosa en un cameCase y no se estropeará si la variable ya contiene cameCase. Segundo UncamelCaso convierte camelCase en guión bajo (gran característica cuando se trata de claves de base 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;

En uso de Laravel Str::camel()

use Illuminate\Support\Str;

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

// fooBar

avatar de usuario
paige ruten

probablemente usaría preg_replace_callback()como esto:

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

function removeDashAndCapitalize($matches) {
  return strtoupper($matches[0][1]);
}

avatar de usuario
Encender

Estas buscando preg_replace_callbackpuedes usarlo así:

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

¿Ha sido útil esta solución?