簡體   English   中英

解析命令行參數/ argv

[英]Parsing through command line arguments/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 = Austin,Duncan,Eddie --type = gold”時,它將其輸出為

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。

你的第二個和第三個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 = "";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM