phpstringpascalcasingsnakecasing

How to convert PascalCase to snake_case?


If I had:

$string = "PascalCase";

I need

"pascal_case"

Does PHP offer a function for this purpose?


Solution

  • Try this on for size:

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

    Output:

    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
    

    This implements the following rules:

    1. A sequence beginning with a lowercase letter must be followed by lowercase letters and digits;
    2. A sequence beginning with an uppercase letter can be followed by either:
      • one or more uppercase letters and digits (followed by either the end of the string or an uppercase letter followed by a lowercase letter or digit ie the start of the next sequence); or
      • one or more lowercase letters or digits.