1. ホーム
  2. php

[解決済み] PascalCaseをsnake_caseに変換するには?

2022-07-03 09:40:23

質問

もし、私が

$string = "PascalCase";

必要なのは

"pascal_case"

PHPはこのような目的のための関数を提供していますか?

どのように解決するのですか?

試しに着てみてください。

$tests = array(
  'simpleTest' => 'simple_test',
  'easy' => 'easy',
  'HTML' => 'html',
  'simpleXML' => 'simple_xml',
  'PDFLoad' => 'pdf_load',
  'startMIDDLELast' => 'start_middle_last',
  'AString' => 'a_string',
  'Some4Numbers234' => 'some4_numbers234',
  'TEST123String' => 'test123_string',
);

foreach ($tests as $test => $result) {
  $output = from_camel_case($test);
  if ($output === $result) {
    echo "Pass: $test => $result\n";
  } else {
    echo "Fail: $test => $result [$output]\n";
  }
}

function from_camel_case($input) {
  preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $input, $matches);
  $ret = $matches[0];
  foreach ($ret as &$match) {
    $match = $match == strtoupper($match) ? strtolower($match) : lcfirst($match);
  }
  return implode('_', $ret);
}

出力します。

Pass: simpleTest => simple_test
Pass: easy => easy
Pass: HTML => html
Pass: simpleXML => simple_xml
Pass: PDFLoad => pdf_load
Pass: startMIDDLELast => start_middle_last
Pass: AString => a_string
Pass: Some4Numbers234 => some4_numbers234
Pass: TEST123String => test123_string

これは以下のルールを実装しています。

  1. 小文字で始まるシーケンスは、小文字と数字が続かなければならない。
  2. 大文字で始まるシーケンスは、どちらかが続く。
    • 一つ以上の大文字と数字(文字列の終わりか、大文字の後に小文字または数字が続き、次のシーケンスの開始となる)、または
    • 1つまたは複数の小文字または数字。