PHP:为命令行网站标记输入字符串


PHP: Tokenizing input string for command-line website

我正在进行一个小型的附带项目,该项目涉及构建一个类似命令行/终端的接口。我选择使用Symfony的控制台组件作为主要功能的主干。

困扰我的是如何处理用户可以提供的各种形式的输入。

以下是一个示例:假设我想创建一个MessageCommand,它接受参数和选项(选项名称以--为前缀)。此命令应该具有读取消息并将消息发送给另一个用户的功能。要发送消息,用户应该能够在没有引号的情况下输入,比如:

message send --title Hello there --text How are you doing?

因此,这是我试图为上面的例子工作的代码:

private function tokenize($input)
{
    $tokens   = array();
    $isOption = false;
    $len      = strlen($input);
    $previous = '';
    $buffer   = '';
    for ($i = 0; $i < $len; $i++)
    {
        $current = $input[$i];
        switch ($current)
        {
            case '-';
                if ($previous == '-')
                {
                    $isOption = true;
                }
                $buffer .= '-';
                break;
            default:
                if ($isOption || $current != ' ')
                {
                    $buffer .= $current;
                }
                elseif ($current == " " && $previous != " " && strlen($buffer) > 0)
                {
                    $tokens[] = $buffer;
                    $buffer   = "";
                }
        }
        $previous = $current;
    }
    if (strlen($buffer) > 0)
    {
        $tokens[] = $buffer;
    }
    return $tokens;
}

在当前状态下,将所述字符串标记为:

array(
    'message',
    'send',
    '--title Hello there --text How are you doing?'
)

所以,我请求你帮助我应该如何修改上面的代码,这样它就会给出这样的数组:

array(
    'message',
    'send',
    '--title',
    'Hello there',
    '--text',
    'How are you doing?'
)

提前感谢您!

我会用空格分解你的输入,然后在循环中检查substr($string_n,0,2)=="--",然后连接所有接下来的行,直到我再次找到这个"--"。

$input = 'message send --title Hello there --text How are you doing?';
    $rows = explode(' ', $input);
    $tokens = array();
    $isOption = false;
    foreach ($rows as $row) {
        if(substr($row, 0, 2) === '--') {
            $isOption = true;
            $tokens[] = $row;
        } else if($isOption === true && substr($tokens[count($tokens) - 1], 0, 2) !== '--') {
            $tokens[count($tokens) - 1] .= ' ' . $row;
        } else {    
        $tokens[] = $row;
        }
    }
     var_dump($tokens);

我在var_dump:中得到了什么

         array(6) {
          [0]=>
          string(7) "message"
          [1]=>
          string(4) "send"
          [2]=>
          string(7) "--title"
          [3]=>
          string(11) "Hello there"
          [4]=>
          string(6) "--text"
          [5]=>
          string(18) "How are you doing?"
        }