Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php preg_match(正则表达式)将camelCase单词拆分为单词_Php_Regex_String_Preg Match - Fatal编程技术网

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

使用php preg_match(正则表达式)将camelCase单词拆分为单词,php,regex,string,preg-match,Php,Regex,String,Preg Match,我该如何拆分这个词: oneTwoThreeFour 进入阵列,以便我可以获得: one Two Three Four 与preg_匹配 我对此感到厌倦,但它只是提供了一个完整的词 $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)`; 您可以使用preg\u split作为: $arr = preg_split('/(?=[A

我该如何拆分这个词:

oneTwoThreeFour
进入阵列,以便我可以获得:

one Two Three Four
preg_匹配

我对此感到厌倦,但它只是提供了一个完整的词

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

您可以使用
preg\u split
作为:

$arr = preg_split('/(?=[A-Z])/',$str);
preg_match_all('/((?:^|[A-Z])[a-z]+)/',$str,$matches);


我基本上是在大写字母之前拆分输入字符串。使用的正则表达式
(?=[A-Z])
与大写字母前的点匹配。

您也可以使用
preg\u match\u all

$arr = preg_split('/(?=[A-Z])/',$str);
preg_match_all('/((?:^|[A-Z])[a-z]+)/',$str,$matches);
说明:

(        - Start of capturing parenthesis.
 (?:     - Start of non-capturing parenthesis.
  ^      - Start anchor.
  |      - Alternation.
  [A-Z]  - Any one capital letter.
 )       - End of non-capturing parenthesis.
 [a-z]+  - one ore more lowercase letter.
)        - End of capturing parenthesis.

另一个选项是匹配
/[A-Z]?[A-Z]+/
-如果您知道输入的格式正确,它应该可以很好地工作

[A-Z]?
将匹配大写字母(或不匹配)<代码>[a-z]+将匹配以下所有小写字母,直到下一个匹配为止


工作示例:

我知道这是一个有公认答案的老问题,但我知道有什么更好的解决方案:


诀窍是一个可重复的模式$1$2$1$2或更低的上下等。。。。
例如
helloWorld=$1与“hello”匹配,$2与“W”匹配,$1与“World”匹配,因此简而言之,您得到$1$2$1或“hello World”,将helloWorld与$2$1$2$1匹配,或再次与“hello World”匹配。然后,您可以在第一个单词中使用大写字母或小写字母,或者在空格中使用u或其他字符将它们分开


简洁明了。

功能化版本的@ridgerunner答案

/**
 * Converts camelCase string to have spaces between each.
 * @param $camelCaseString
 * @return string
 */
function fromCamelCase($camelCaseString) {
        $re = '/(?<=[a-z])(?=[A-Z])/x';
        $a = preg_split($re, $camelCaseString);
        return join($a, " " );
}
/**
*将大小写字符串转换为每个字符串之间有空格。
*@param$camelCaseString
*@返回字符串
*/
camelcase的函数($camelCaseString){
$re='/(?您可以在“滑动”中从小写字母拆分为大写字母,因此:

$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中的每一对对应项中重建单词


希望这有助于

< P> > RigGelunne的回答很好,似乎不适用于出现在句子中段的所有CAPs子串。我使用下面的方法,似乎处理好了:

function splitCamelCase($input)
{
    return preg_split(
        '/(^[^A-Z]+|[A-Z][^A-Z]+)/',
        $input,
        -1, /* no limit for replacement count */
        PREG_SPLIT_NO_EMPTY /*don't return empty elements*/
            | PREG_SPLIT_DELIM_CAPTURE /*don't strip anything from output array*/
    );
}
一些测试用例:

assert(splitCamelCase('lowHigh') == ['low', 'High']);
assert(splitCamelCase('WarriorPrincess') == ['Warrior', 'Princess']);
assert(splitCamelCase('SupportSEELE') == ['Support', 'SEELE']);
assert(splitCamelCase('LaunchFLEIAModule') == ['Launch', 'FLEIA', 'Module']);
assert(splitCamelCase('anotherNASATrip') == ['another', 'NASA', 'Trip']);

首先,Coddick感谢你的模式,它帮助了很多

我需要一个在介词“a”存在的情况下有效的解决方案:

e、 g.这是一个很好的判决

我通过两步预匹配找到了解决方案,并制作了一个带有一些选项的函数:

/*
 * 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; 
}

请随意使用它,如果有一种“更简单”的方法可以一步完成,请发表评论!

我使用了cool guy Ridgerunner的代码(如上)并将其制作成一个函数:

echo deliciousCamelcase('NewNASAModule');

function deliciousCamelcase($str)
{
    $formattedStr = '';
    $re = '/
          (?<=[a-z])
          (?=[A-Z])
        | (?<=[A-Z])
          (?=[A-Z][a-z])
        /x';
    $a = preg_split($re, $str);
    $formattedStr = implode(' ', $a);
    return $formattedStr;
}
echo deliciousamelcase('NewNASAModule');
功能Delicious案例($str)
{
$formattedStr='';
$re=/

(?基于@codaddict答案的完整功能:

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

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

当确定项目的最佳模式时,您需要考虑以下模式因素:

  • 准确性(稳健性)——模式是否在所有情况下都是正确的,并且是合理的未来证明
  • 效率——模式应该是直接的、深思熟虑的,并且避免不必要的劳动
  • 简洁——模式应该使用适当的技术来避免不必要的字符长度
  • 可读性——模式应该尽可能简单
  • 上述因素也恰好是在努力遵守的层次顺序中。换句话说,当1不完全满足要求时,对2、3或4进行优先排序对我来说没有多大意义。可读性在列表的底部,因为在大多数情况下我可以遵循语法

    捕获组和Lookarounds通常会影响模式效率。事实是,除非您在数千个输入字符串上执行此正则表达式,否则无需过度提高效率。可能更重要的是关注与模式简洁性相关的模式可读性

    下面的一些模式需要通过其
    preg
    函数进行一些额外的处理/标记,但以下是一些基于OP示例输入的模式比较:

    preg\u split()
    模式:

    • /^[^A-Z]+\K |[A-Z][^A-Z]+\K/
      (21个步骤)
    • /(^[^A-Z]+|[A-Z][^A-Z]+)/
      (26个步骤)
    • /[^A-Z]+\K(?=[A-Z])/
      (43个步骤)
    • /(?=[A-Z])/
      (50步)
    • /(?=[A-Z]+)/
      (50步)
    • /([a-z]{1})[a-z]{1}/
      (53个步骤)
    • /([a-z0-9])([a-Z])/
      (68个步骤)

    • /(?这是一个更好的解决方案,第一次起作用(其他人在数组中添加了空白值,这是完美的!谢谢!+1像
      NewNASAModule
      (输出:
      [New,NASAModule]
      ;我希望
      [New,NASA,Module]
      )@rr-是的,你是正确的。请参阅我的另一个更新答案,该答案拆分为:
      NewNASAModule
      正确:它不包含数字大小写。出于某种原因,其他回复者也忽略了这一基本事实。例如,“Css3Transform”或alikeoops,这可能会在连续的CAPS问题上失败。非捕获组不会导致结果失败[one,wo,hree,our]?@AaronJLang不,因为外圆括号捕获了整个组,包括子组。他不想把$matches集合弄得乱七八糟。这对我来说是失败的,因为“TestID”使用了:“preg_match_all('/(?:^[a-Z][a-Z]+)/”,$key,$matches);die(内爆(',$matches[0])”因为它不喜欢连续大写的问题。我需要用空格分割大小写更改,@blak3r的解决方案对我来说很有效:
      HTMLParser
      等字符串的更好解决方案会起作用:。正如@TarranJones所规定的那样(尽管表达得不太清楚),您不需要外括号。匹配的
      字符串/(?:^ |[A-Z])[A-Z]+/'
      足以生成一个数组(而不是两个)。这是因为
      preg_match_all()
      自动捕获匹配的所有实例,而无需特别规定。美观大方-始终优先
      $noAcronyms = 'oneTwoThreeFour';
      var_export(preg_split('~^[^A-Z]+\K|[A-Z][^A-Z]+\K~', $noAcronyms, 0, PREG_SPLIT_NO_EMPTY));
      echo "\n---\n";
      var_export(preg_match_all('~[A-Z]?[^A-Z]+~', $noAcronyms, $out) ? $out[0] : []);
      
      $withAcronyms = 'newNASAModule';
      var_export(preg_split('~[^A-Z]+\K|(?=[A-Z][^A-Z]+)~', $withAcronyms, 0, PREG_SPLIT_NO_EMPTY));
      echo "\n---\n";
      var_export(preg_match_all('~[A-Z]?[^A-Z]+|[A-Z]+(?=[A-Z][^A-Z]|$)~', $withAcronyms, $out) ? $out[0] : []);