PHP: токенизация входной строки для веб-сайта командной строки

1

Я работаю над небольшим побочным проектом, который предполагает создание интерфейса командной строки/терминала. Я решил использовать компонент Symfony Console в качестве основы для основных функций.

Меня беспокоит то, как обращаться с различными формами ввода, которые может дать пользователь.

Вот пример: пусть говорят, что я хотел бы создать 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?'
)

Огромное спасибо заранее!

Теги:
terminal
console
parsing
tokenize

1 ответ

1

Я бы взорвал ваш вход с пробелом, а затем в цикле и проверил, если 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?"
        }
  • 0
    Большое вам спасибо, сэр! Я все еще задаюсь вопросом, можно ли было бы сделать с кодом, который я разместил, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню