我正在进行一个小型的附带项目,该项目涉及构建一个类似命令行/终端的接口。我选择使用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?"
}