2017-02-21 5 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; 
} 

Это функция, в которой я разбираю аргументы командной строки. Моя проблема заключается в том, что, когда я вхожу "PHP testArgs.php -v -Т 4 -l знач1, 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

Кроме того, в чем смысл аргумента '$ argv', который вы передаете в функцию, если первое, что вы делаете в этой функции, перезаписывает ее с помощью' $ this-> argsUnparsed'? Либо избавиться от аргумента функции, либо потерять строку, которая перезаписывает аргумент и использует то, что передается. Я бы предложил последнее просто потому, что тогда ваша функция не полагается на то, что она находится в этом классе и может быть использована в другом месте. –

ответ

0

Ваш второй и третий блоки 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 if –

+0

Мой код пытается заменить ваш первый 'else if' (чтобы проверить, содержит ли переданный аргумент« - ») и ваш последний' else' (чтобы добавить arg передается массиву). – Fredster

+0

Большое спасибо человеку –