使用PHP preg_match(正则表达式)将camelCase单词拆分为单词

77

我应该如何分割单词:

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)`;

也许我的问题可以帮到你, 我昨天问了同样的问题,但是关于Java https://dev59.com/AFLTa4cB1Zd3GeqPd9Um - Gondim
13个回答

0

首先要感谢codaddict提供的模式,它帮了我很大的忙!

我需要一个解决方案,以防万一存在介词“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

基于@codaddict的答案,完整的函数如下:

function splitCamelCase($str) {
    $splitCamelArray = preg_split('/(?=[A-Z])/', $str);

    return ucwords(implode($splitCamelArray, ' '));
}

0

你可以通过“滑动”从小写字母分割到大写字母,如下:

$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中的每个对应项重新构建单词。

希望这可以帮助到您。


哎呀,这个可能会在连续大写字母的问题上失败。 - Daniel Rhodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接