通过命令行参数进行解析/ argv

问题描述:

因此,我必须制作一个解析器来解析传递给它的命令行参数。以下是我迄今为止的代码。通过命令行参数进行解析/ argv

public function parse($argv = null) 
{ 
    $argv = $this->argsUnparsed; 
    $argvs = array(); 
    array_shift($argvs); 
    foreach($argv as $arg) 
    { 
      // This is supposed to find the -- characters in a string 
      if(substr($arg,0,2) == '--') 
      { 
        $equals = strpos($arg, '='); 
        // If character in string equals '=' saving anything before it as a key and anything afterward as a value 
        if($equals) 
        { 
          $argvs[substr($arg,2,$equals - 2)] = substr($arg,$equals + 1); 
        } 
        else 
        { 
          $k = substr($arg,2); 
          if(!isset($argvs[$k])) 
          { 
            $argvs[$k] = true; 
          } 

        } 
      } 
      else if(substr($arg,0,1) == '-') 
      { 
        foreach(str_split(substr($arg,1)) as $k) 
        { 
          if(!isset($argvs[$k])) 
          { 
            $argvs[$k] = true; 
          } 
          elseif($equals == false) 
          { 
            $argvs[substr($arg,2,$equals - 2)] = substr($arg,$equals + 1); 
          } 
        } 


      } 
      else 
      { 
        $argvs[] = $arg; 
      } 
    } 
    return $argvs; 
} 

这是我解析命令行参数的函数。我的问题是,当我输入 “PHP testArgs.php -v -T 4 -l VAL1,VAL2,VAL3 --names =奥斯汀,邓肯,埃迪--type =金” 它打印出来作为

Array 
(
    [0] => testArgs.php 
    [v] => 1 
    [T] => 1 
    [1] => 4 
    [l] => 1 
    [2] => val1,val2,val3 
    [names] => Austin,Duncan,Eddie 
    [type] => gold 
) 

第二个和最后两个阵列插槽是完全正确的,但其余的应按以下方式打印出来。

[T] => 4 
[l] => val1,val2,val3 

另外,不应显示第一个数组键值对[0] => testArgs.php。

+0

对于单'-',你是不是检查的'='的位置,但使用的是您在使用相同的'$ equals'变量'--'。另外,由于您没有对'-'参数使用'='符号,所以您必须查看下一个参数以查看它是否以'-'开头并指定该值(并跳过下一个)或者为true '如果没有。此外,这会导致多个'-'参数出现问题,所以您只需要为最后一个(或者定义为具有一个值,它一次只需要一个字符)就可以做到这一点。为了正常工作,我会建议使用for循环而不是foreach。 –

+1

另外,如果您在函数中做的第一件事是用'$ this-> argsUnparsed'覆盖它,那么将参数'$ argv'传递给函数有什么意义?要么摆脱函数的参数,要么丢掉覆盖参数的行,并使用传入的行。我建议后者只是因为那时你的函数不依赖于它在该类中,并且可以在其他地方使用。 –

你的第二个和第三个else if块应该更简单。 尝试是这样的:

<?php 
    ... 
    // Check if a key is passed that begins with "-" 
    else if(substr($arg,0,1) == '-') 
    { 
     $k = substr($arg,1); 
     if(!isset($argvs[$k])) 
     { 
       $argvs[$k] = true; 
       $previous_key = $k; 
     } 

    } 
    // Copy the value being parsed to the previous key 
    else if(!is_empty($previous_key)) 
    {   
     $argvs[$previous_key] = $arg; 
    } 

    $previous_key = ""; 
+0

只是有点困惑,我只有两个其他的if语句 –

+0

我的代码试图替换你的第一个'else if'(检查arg是否包含“ - ”)和最后一个'else'(添加arg传递给数组)。 – Fredster

+0

非常感谢你 –