Skip to content

Instantly share code, notes, and snippets.

@okumurakengo
Created December 31, 2024 06:57
Show Gist options
  • Select an option

  • Save okumurakengo/73f590d668e33d8f4f486f74d192340a to your computer and use it in GitHub Desktop.

Select an option

Save okumurakengo/73f590d668e33d8f4f486f74d192340a to your computer and use it in GitHub Desktop.
ChatGPTに作ってもらったキャメルケースとスネークケースの変換クラス
<?php
declare(strict_types=1);
namespace App\Handlers;
/**
* Class StringCaseHandler
*/
class StringCaseHandler
{
/**
* @param string $string
* @return bool
*/
public static function isCamelCase(string $string): bool
{
return preg_match('/^[a-z]+(?:[A-Z][a-z]*)*$/', $string) === 1;
}
/**
* @param string $string
* @return bool
*/
public static function isPascalCase(string $string): bool
{
return preg_match('/^[A-Z][a-z]*(?:[A-Z][a-z]*)*$/', $string) === 1;
}
/**
* @param string $string
* @return bool
*/
public static function isSnakeCase(string $string): bool
{
return preg_match('/^[a-z]+(?:_[a-z]+)*$/', $string) === 1;
}
/**
* Convert CamelCase or PascalCase to snake_case.
*
* @param string $input
* @return string
*/
public static function toSnakeCase(string $input): string
{
// キャメルケースやパスカルケースをアンダースコアに変換し、小文字にする
return strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $input));
}
/**
* Convert snake_case to camelCase.
*
* @param string $input
* @return string
*/
public static function toCamelCase(string $input): string
{
// アンダースコアの次の文字を大文字に変換し結合
return lcfirst(str_replace('_', '', ucwords($input, '_')));
}
}
<?php
namespace Tests\Unit\App\Handler;
use App\Handlers\StringCaseHandler;
use PHPUnit\Framework\TestCase;
class StringCaseHandlerTest extends TestCase
{
public function testIsCamelCase()
{
$this->assertTrue(StringCaseHandler::isCamelCase('camelCase'));
$this->assertTrue(StringCaseHandler::isCamelCase('camelCaseExample'));
$this->assertFalse(StringCaseHandler::isCamelCase('CamelCase')); // PascalCase
$this->assertFalse(StringCaseHandler::isCamelCase('snake_case'));
$this->assertFalse(StringCaseHandler::isCamelCase('camel_case'));
$this->assertFalse(StringCaseHandler::isCamelCase('camelCase123'));
}
public function testIsPascalCase()
{
$this->assertTrue(StringCaseHandler::isPascalCase('PascalCase'));
$this->assertTrue(StringCaseHandler::isPascalCase('PascalCaseExample'));
$this->assertFalse(StringCaseHandler::isPascalCase('camelCase'));
$this->assertFalse(StringCaseHandler::isPascalCase('snake_case'));
$this->assertFalse(StringCaseHandler::isPascalCase('Pascal_case'));
$this->assertFalse(StringCaseHandler::isPascalCase('PascalCase123'));
}
public function testIsSnakeCase()
{
$this->assertTrue(StringCaseHandler::isSnakeCase('snake_case'));
$this->assertTrue(StringCaseHandler::isSnakeCase('snake_case_example'));
$this->assertFalse(StringCaseHandler::isSnakeCase('Snake_case')); // Pascal-like
$this->assertFalse(StringCaseHandler::isSnakeCase('snakeCase')); // camelCase-like
$this->assertFalse(StringCaseHandler::isSnakeCase('snake_case123'));
$this->assertFalse(StringCaseHandler::isSnakeCase('snake__case')); // invalid snake_case
}
public function testToSnakeCase()
{
// キャメルケースの変換テスト
$this->assertEquals('camel_case', StringCaseHandler::toSnakeCase('camelCase'));
$this->assertEquals('camel_case_example', StringCaseHandler::toSnakeCase('camelCaseExample'));
// パスカルケースの変換テスト
$this->assertEquals('pascal_case', StringCaseHandler::toSnakeCase('PascalCase'));
$this->assertEquals('pascal_case_example', StringCaseHandler::toSnakeCase('PascalCaseExample'));
// その他ケース
$this->assertEquals('already_snake_case', StringCaseHandler::toSnakeCase('already_snake_case'));
}
public function testToCamelCase()
{
// スネークケースの変換テスト
$this->assertEquals('camelCase', StringCaseHandler::toCamelCase('camel_case'));
$this->assertEquals('camelCaseExample', StringCaseHandler::toCamelCase('camel_case_example'));
// 単一単語
$this->assertEquals('single', StringCaseHandler::toCamelCase('single'));
// その他ケース
$this->assertEquals('alreadyCamelCase', StringCaseHandler::toCamelCase('alreadyCamelCase')); // そのまま
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment