How to convert PascalCase to pascal_case?

前端 未结 30 1471
北海茫月
北海茫月 2020-11-29 16:36

If I had:

$string = \"PascalCase\";

I need

\"pascal_case\"

Does PHP offer a function for this purpose?

相关标签:
30条回答
  • 2020-11-29 17:09

    The direct port from rails (minus their special handling for :: or acronyms) would be

    function underscore($word){
        $word = preg_replace('#([A-Z\d]+)([A-Z][a-z])#','\1_\2', $word);
        $word = preg_replace('#([a-z\d])([A-Z])#', '\1_\2', $word);
        return strtolower(strtr($word, '-', '_'));
    }
    

    Knowing PHP, this will be faster than the manual parsing that's happening in other answers given here. The disadvantage is that you don't get to chose what to use as a separator between words, but that wasn't part of the question.

    Also check the relevant rails source code

    Note that this is intended for use with ASCII identifiers. If you need to do this with characters outside of the ASCII range, use the '/u' modifier for preg_matchand use mb_strtolower.

    0 讨论(0)
  • 2020-11-29 17:10

    A concise solution and can handle some tricky use cases:

    function decamelize($string) {
        return strtolower(preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $string));
    }
    

    Can handle all these cases:

    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
    hello_world => hello_world
    hello__world => hello__world
    _hello_world_ => _hello_world_
    hello_World => hello_world
    HelloWorld => hello_world
    helloWorldFoo => hello_world_foo
    hello-world => hello-world
    myHTMLFiLe => my_html_fi_le
    aBaBaB => a_ba_ba_b
    BaBaBa => ba_ba_ba
    libC => lib_c
    

    You can test this function here: http://syframework.alwaysdata.net/decamelize

    0 讨论(0)
  • 2020-11-29 17:10

    Here is my contribution to a six-year-old question with god knows how many answers...

    It will convert all words in the provided string that are in camelcase to snakecase. For example "SuperSpecialAwesome and also FizBuzz καιΚάτιΑκόμα" will be converted to "super_special_awesome and also fizz_buzz και_κάτι_ακόμα".

    mb_strtolower(
        preg_replace_callback(
            '/(?<!\b|_)\p{Lu}/u',
            function ($a) {
                return "_$a[0]";
            },
            'SuperSpecialAwesome'
        )
    );
    
    0 讨论(0)
  • 2020-11-29 17:10

    Yii2 have the different function to make the word snake_case from CamelCase.

        /**
         * Converts any "CamelCased" into an "underscored_word".
         * @param string $words the word(s) to underscore
         * @return string
         */
        public static function underscore($words)
        {
            return strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $words));
        }
    
    0 讨论(0)
  • 2020-11-29 17:13

    Short solution:

    $subject = "PascalCase";
    echo strtolower(preg_replace('/\B([A-Z])/', '_$1', $subject));
    
    0 讨论(0)
  • 2020-11-29 17:14

    The worst answer on here was so close to being the best(use a framework). NO DON'T, just take a look at the source code. seeing what a well established framework uses would be a far more reliable approach(tried and tested). The Zend framework has some word filters which fit your needs. Source.

    here is a couple of methods I adapted from the source.

    function CamelCaseToSeparator($value,$separator = ' ')
    {
        if (!is_scalar($value) && !is_array($value)) {
            return $value;
        }
        if (defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') == 1) {
            $pattern     = ['#(?<=(?:\p{Lu}))(\p{Lu}\p{Ll})#', '#(?<=(?:\p{Ll}|\p{Nd}))(\p{Lu})#'];
            $replacement = [$separator . '\1', $separator . '\1'];
        } else {
            $pattern     = ['#(?<=(?:[A-Z]))([A-Z]+)([A-Z][a-z])#', '#(?<=(?:[a-z0-9]))([A-Z])#'];
            $replacement = ['\1' . $separator . '\2', $separator . '\1'];
        }
        return preg_replace($pattern, $replacement, $value);
    }
    function CamelCaseToUnderscore($value){
        return CamelCaseToSeparator($value,'_');
    }
    function CamelCaseToDash($value){
        return CamelCaseToSeparator($value,'-');
    }
    $string = CamelCaseToUnderscore("CamelCase");
    
    0 讨论(0)
提交回复
热议问题