2017-02-21 14 views
1

したがって、渡されるコマンドライン引数を解析するパーサを作成する必要があります。以下は私がこれまで持っていたコードです。コマンドライン引数/ 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; 
} 

これはコマンドライン引数を解析する機能です。私が入力したときに私の問題は、それが

Array 
(
    [0] => testArgs.php 
    [v] => 1 
    [T] => 1 
    [1] => 4 
    [l] => 1 
    [2] => val1,val2,val3 
    [names] => Austin,Duncan,Eddie 
    [type] => gold 
) 
として、それをプリントアウトし、 "PHP testArgs.php -v -T 4 -l VAL1、VAL2、val3は--names =オースティン、ダンカン、エディ--type =金" ということです

2番目と最後の2つのアレイスロットは完全に正しいですが、残りの部分は次のように出力されるべきです(SHOULD)。

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

また、最初の配列キー値のペア[0] => testArgs.phpは表示しないでください。

+0

を、あなたは' = 'の位置をチェックしていますが、' --'以内に使用するのと同じ '$ equals'変数を使用していません。また、 ' - '引数に '= '記号を使用していないので、次の引数を調べて' -'で始まり、その値を割り当て(そして次にスキップする)か 'true 'もしそうでなければ。さらに、これは複数の '-'引数の問題を引き起こすので、最後の引数のためにこれを行う必要があります(または、値を持つためには一度に1文字にする必要があります)。これが正しく動作するためには、foreachではなくforループを提案します。 –

+1

また、関数内で最初に行うことが '$ this-> argsUnparsed'で上書きされた場合、関数に渡す引数' $ argv'を持つ点は何ですか?関数の引数を取り除くか、引数を上書きして渡された行を使用しないでください。後者は、関数がそのクラス内に依存せず他の場所でも使用できるためです。 –

答えて

0

第2および第3の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

ほんの少し混乱していますが、私は2つのif文しか持っていません –

+0

私のコードはあなたの最初の 'else if'を置き換えようとしています(argに" - "配列に渡されます)。 – Fredster

+0

ありがとう –

関連する問題