2010-05-07 10 views
54

Quelqu'un peut-il m'aider à compléter cette fonction PHP? Je veux prendre une chaîne comme ceci: 'this-is-a-string' et le convertir à ceci: 'thisIsAString':Convertir des tirets en CamelCase en PHP

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


    return $string; 
} 

Répondre

108

Pas regex ou callbacks nécessaire. Presque tout le travail peut être fait avec 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 vous utilisez PHP> = 5.3, vous pouvez utiliser lcfirst au lieu de strtolower.

Mise à jour

Un second paramètre a été ajouté à ucwords en PHP 5.4.32/5.5.16 qui signifie que nous ne devons d'abord changer les tirets aux espaces (grâce à Lars Ebert et PeterM pour avoir signalé). Voici le code mis à jour:

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

Notez que' ucwords' accepte en fait un délimiteur comme deuxième paramètre (voir [réponse de PeterM] (http://stackoverflow.com/a/33122760/2580794)), donc l'un des appels 'str_replace' serait inutile. –

+0

Merci pour l'info @LarsEbert. J'ai mis à jour la réponse. – webbiedave

3
$string = explode("-", $string); 
$first = true; 
foreach($string as &$v) { 
    if($first) { 
     $first = false; 
     continue; 
    } 
    $v = ucfirst($v); 
} 
return implode("", $string); 

code non testé. Vérifiez les docs PHP pour les fonctions im-/explode et ucfirst.

6

Je probablement utiliser preg_replace_callback(), comme ceci:

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

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

Essayez ceci:

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

Le modificateur/e est obsolète dans PHP 5.5. –

+1

[Plus d'infos sur 'modificateur deprecation e'] (http://php.net/manual/fr/reference.pcre.pattern.modifiers.php#reference.pcre.pattern.modifiers.eval) – fracz

-2

C'est plus simple:

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

Le modificateur/e est obsolète en PHP 5.5. –

5

c'est ma variation sur la façon de traiter avec elle. Ici, j'ai deux fonctions, la première camelCase transforme n'importe quoi dans un camelCase et il ne gâchera pas si la variable contient déjà cameCase. Seconde uncamelCase transforme camelCase en trait de soulignement (très pratique pour les clés de base de données).

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

permet de tester à la fois:

$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; 
     }, 
     ''); 
} 

De toute évidence, si un autre delimiter que '-', par exemple '_', est à mettre en correspondance aussi, alors cela ne fonctionnera pas, alors un preg_replace pourrait convertir tous les délimiteurs (consécutifs) à '-' en $ text d'abord ...

+0

Je ne vois pas vraiment comment cela est plus simple, plus clair ou mieux que la solution fournie (et acceptée) il y a environ 4 ans. – ccjmne

1

Sinon, si vous préférez ne pas traiter avec regex, et que vous voulez éviter explicites boucles:

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

vous cherchez preg_replace_callback, vous pouvez l'utiliser comme ceci:

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

cette fonction est similaire à la fonction @ 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); 
} 

Mais plus clair, (je pense: D) et avec le paramètre optionnel pour mettre en majuscule la première lettre ou non.

Utilisation:

$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

Cela peut se faire très simplement, bu à l'aide ucwords qui accepte delimiter comme param:

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

REMARQUE: besoin php au moins 5.4.32, 5.5. 16

+17

Cela retournera quelque chose comme CamelCase - si vous voulez que ce soit quelque chose comme camelCase alors: 'return str_replace ($ separator, '', lcfirst (ucwords ($ input, $ separator)));' –

+0

appelé PascalCase. votez pour une mauvaise solution –

+0

@ Alex.Designworks ne hésitez pas à améliorer – PeterM

2

Un revêtement, PHP> = 5.3:

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

s'il vous plaît ajouter quelques explications comment cela peut/va aider l'OP – davejal

0

Une autre approche simple:

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

Surchargé oneliner, avec wrapper bloc doc ...

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

Cela va retourner 'null' – PeterM

+0

La fonction manquait un' retour' ...mis à jour, merci. Voici un lien pour tester ce https://3v4l.org/YBHPd – doublejosh

+0

Bon, c'est toujours mieux d'afficher du code réellement testé. – PeterM

1

ici est une solution très très facile dans un code de ligne

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

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

sortie ThisIsAString

0

Si vous utilisez le framework Laravel, vous pouvez utiliser uniquement la méthode camel_case().

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

La bibliothèque TurboCommons contient un objectif général de la méthode formatCase() dans la classe StringUtils, ce qui vous permet de convertir une chaîne à beaucoup de formats de cas communs, comme CamelCase, UpperCamelCase, lowerCamelCase, snake_case, Titre du cas, et beaucoup plus.

https://github.com/edertone/TurboCommons

Pour l'utiliser, importer le fichier phar à votre projet et:

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

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

// will output 'sNakeCase' 
0

Voici une autre option:

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

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

    return implode('', $parts); 
} 
Questions connexes