2010-05-07 16 views
54

¿Alguien me puede ayudar a completar esta función de PHP? Quiero tomar una cadena como esta: 'this-is-a-cadena' y convertirlo a esto: 'thisIsAString':Convertir guiones en CamelCase en PHP

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


    return $string; 
} 

Respuesta

108

Sin expresiones regulares o devoluciones de llamada es necesario. 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, se puede utilizar en lugar de lcfirst strtolower.

actualización

Un segundo parámetro se añadió a ucwords en PHP 4.5.32/5.5.16 lo que significa que no tenemos que cambiar primero los guiones a los espacios (gracias a Lars Ebert y PeterM por señalar esto) Aquí está el código de actualización:

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

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

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

    return $str; 
} 

echo dashesToCamelCase('this-is-a-string'); 
+13

'if (! $ CapitalizeFirstCharacter) { $ str = lcfirst ($ str); } ' – AVProgrammer

+2

Tenga en cuenta que' ucwords' en realidad acepta un delimitador como segundo parámetro (consulte [answer by PeterM] (http://stackoverflow.com/a/33122760/2580794)), por lo que una de las llamadas 'str_replace' sería innecesario. –

+0

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

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. Compruebe los documentos PHP para las funciones im-/explode y ucfirst.

6

utilizaría probablemente 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]); 
} 
0

Prueba esto:

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

El modificador/e está en desuso en PHP 5.5. –

+1

[Más información sobre la desactivación del modificador 'e'] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php#reference.pcre.pattern.modifiers.eval) – fracz

-2

Esto es más sencillo:

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

El modificador/e desaprobado en PHP 5.5. –

5

esta es mi variación sobre cómo tratar con él. Aquí tengo dos funciones, la primera camelCase convierte cualquier cosa en un camelCase y no se ensuciará si la variable ya contiene cameCase. La segunda uncamelCase convierte camelCase en 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\-_ ][email protected]', '', $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; 
} 

permite tanto la prueba:

$camel = camelCase("James_LIKES-camelCase"); 
$uncamel = uncamelCase($camel); 
echo $camel." ".$uncamel; 
0
function camelCase($text) { 
    return array_reduce(
     explode('-', strtolower($text)), 
     function ($carry, $value) { 
      $carry .= ucfirst($value); 
      return $carry; 
     }, 
     ''); 
} 

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

+0

Realmente no veo cómo esto es más simple, más claro o de ninguna manera mejor que la solución provista (y aceptada) hace aproximadamente 4 años. – ccjmne

1

Alternativamente, si prefiere no tratar con expresiones regulares, y desea evitar explícitas bucles:

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

usted está buscando preg_replace_callback, se puede utilizar de esta manera:

$camelCase = preg_replace_callback('/-(.?)/', function($matches) { 
    return ucfirst($matches[1]); 
}, $dashes); 
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 que: D) y con el parámetro opcional para mayúscula o no en la primera letra.

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" 
27

Esto se puede hacer de manera muy sencilla, utilizando bu ucwords delimitador que acepta como parámetro:

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

NOTA: Necesita al menos php 4.5.32, 5.5. 16

+17

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

+0

llamado PascalCase. votar por una solución incorrecta –

+0

@ Alex.Designworks puede mejorar – PeterM

2

Un forro, PHP> = 5,3:

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

por favor agregue alguna explicación de cómo esto puede/ayudará al OP – davejal

0

Otro enfoque simple:

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

oneliner sobrecargado, con el bloque doc envoltorio ...

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

Esto devolverá 'nulo' – PeterM

+0

La función carecía de un' return' ...actualizado, gracias Aquí hay un enlace para probar este https://3v4l.org/YBHPd – doublejosh

+0

Bueno, siempre es mejor publicar el código realmente probado. – PeterM

1

aquí es solución muy muy fácil de código de una línea

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

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

salida ThisIsAString

0

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

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

La biblioteca TurboCommons contiene un propósito general formatCase() método dentro de la clase StringUtils, que permite convertir una cadena a una gran cantidad de formatos de casos comunes, como CamelCase, UpperCamelCase, LowerCamelCase, snake_case, Título del caso, y muchos Más.

https://github.com/edertone/TurboCommons

Para usarlo, importar 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' 
0

Aquí hay otra opción:

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

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

    return implode('', $parts); 
} 
Cuestiones relacionadas