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

Я работаю над небольшим сайд-проектом, который включает в себя создание интерфейса, похожего на командную строку / терминал. Я решил использовать консольный компонент 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?'
)

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

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?"}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]