アンダーバーやハイフンやスペースで単語を繋いだ文字列(例 foo_bar_baz)を、camelCaseやPascalCase(Upper Camel Case)に変換したいことがしばしばある。
その他にも先頭だけ大文字にしたかったり、各単語の先頭だけ大文字にしたかったりとか。
PHPにはucfirst()やucwords()があるから意外に楽にできる。
アンダーバー等で単語を繋いだ文字列を、他の形式に変換する
$separator = '_'; //区切り文字スペース区切りにすればucWords()が使えるのがミソ。もともと使いたい区切り文字がスペースならもっと楽。
$str = 'foo_bar_baz'; //変換対象の文字列
//先頭だけ大文字にする
echo ucFirst($str); // => Foo_bar_baz
//以降の変換の共通前処理
$ucSpace = ucWords(str_replace($separator, ' ', $str)); // => Foo Bar Baz
//各単語の先頭が大文字にする
echo str_replace(' ', $separator, $ucSpace); // => Foo_Bar_Baz
//PascalCase(先頭は大文字)にする
echo str_replace(' ', '', $ucSpace); // => FooBarBaz
//camelCase(先頭は小文字)にする ※要PHP5.3+
echo lcFirst(str_replace(' ', '', $ucSpace)); // => fooBarBaz
lcfirst()のないPHP5.3未満でcamelCaseにするには少し面倒かも。
この方法が一番手軽そう(未検証)→ PHP: lcfirst - Manual
camelCaseから区切り文字で繋いだ形式に変換する
$separator = '_'; //区切り文字PascalCaseからTitle Case(スペース区切りで先頭だけ大文字の形式)への変換なら、strToLower()は要らない。
$camel = 'fooBarBaz';
echo strToLower(preg_replace('/([a-z])([A-Z])/', "$1$separator$2", $camel)); // => foo_bar_baz
ハイフン区切りの文字列・先頭が大文字のスペース区切りの文字列・PascalCaseの文字列の相互変換ならこんな感じか。
function convertCase($str, $case) {正規表現だけでもいろいろできちゃいそうだけど、(正規表現を駆使出来ていない自分のような人には)見辛くなるのでstr_replace()を使った。(コードが横に長くなるし。)
switch ($case) {
case 'hyphen': // foo-bar-baz
$str = preg_replace('/([a-z])([A-Z])/', "$1-$2", $str);
return str_replace(' ', '-', strToLower($str));
case 'normal': // Foo bar baz
$str = preg_replace('/([a-z])([A-Z])/', "$1 $2", $str);
return str_replace('-', ' ', ucFirst(strToLower($str)));
case 'pascal': // FooBarBaz
return str_replace(' ', '', ucWords(str_replace('-', ' ', $str)));
}
}