Разбить слово camelCase на слова с помощью php preg_match (Регулярное выражение) - PullRequest
62 голосов
/ 23 декабря 2010

Как бы я разбил слово:

oneTwoThreeFour

на массив, чтобы я мог получить:

one Two Three Four

с preg_match?

Я устал от этого, но это просто дает целое слово

$words = preg_match("/[a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/", $string, $matches)`;

Ответы [ 12 ]

0 голосов
/ 12 марта 2015

Прежде всего, спасибо за ваш шаблон, это очень помогло!

Мне нужно решение, которое работает, если существует предлог 'a':

например thisIsACamelcaseSentence.

Я нашел решение, выполнив двухшаговый preg_match, и создал функцию с некоторыми опциями:

/*
 * input: 'thisIsACamelCaseSentence' output: 'This Is A Camel Case Sentence'
 * options $case: 'allUppercase'[default] >> 'This Is A Camel Case Sentence'
 *                'allLowerCase'          >> 'this is a camel case sentence'
 *                'firstUpperCase'        >> 'This is a camel case sentence'
 * @return: string
 */

function camelCaseToWords($string, $case = null){
    isset($case) ? $case = $case : $case = 'allUpperCase';

    // Find first occurances of two capitals
    preg_match_all('/((?:^|[A-Z])[A-Z]{1})/',$string, $twoCapitals);

    // Split them with the 'zzzzzz' string. e.g. 'AZ' turns into 'AzzzzzzZ'
    foreach($twoCapitals[0] as $match){
        $firstCapital = $match[0];
        $lastCapital = $match[1];
        $temp = $firstCapital.'zzzzzz'.$lastCapital;
        $string = str_replace($match, $temp, $string);  
    }

    // Now split words
    preg_match_all('/((?:^|[A-Z])[a-z]+)/', $string, $words);

    $output = "";
    $i = 0;
    foreach($words[0] as $word){

            switch($case){
                case 'allUpperCase':
                $word = ucfirst($word);
                break;

                case 'allLowerCase': 
                $word = strtolower($word);
                break;

                case 'firstUpperCase':
                ($i == 0) ? $word = ucfirst($word) : $word = strtolower($word);
                break;                  
            }

            // remove te 'zzzzzz' from a word if it has
            $word = str_replace('zzzzzz','', $word);    
            $output .= $word." ";
            $i++;
    }
    return $output; 
}

Не стесняйтесь использовать ее, и в случае, если есть «более простой» способ сделать этоза один шаг, пожалуйста, прокомментируйте!

0 голосов
/ 17 июля 2013

Вы можете разделить «скольжение» из строчных в прописные, таким образом:

$parts = preg_split('/([a-z]{1})[A-Z]{1}/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);        
//PREG_SPLIT_DELIM_CAPTURE to also return bracketed things
var_dump($parts);

К сожалению, вам придется перестраивать слова из каждой соответствующей пары предметов в $ parts

Надеюсь, это поможет

...