在PHP中,我可以使用以下代码从命令行程序读取输入
$stream = STDIN;
$test = fgets($stream);
echo $test;
这适用于简单输入。但是,如果我尝试使用类似后箭头键的东西,我的shell看起来像下面的
This is a test^[[D^[[D^[[D
即,^[[D
的箭头键转义序列被发送到shell。 PHP本身将解释箭头键 - 即输入此
This is a test^[[D^[[D^[[D^[[Dsecond test
将输出此
This is a second test
然而,我喜欢贝壳,以及#34;正确" (即按照我认为他们应该做的,而不是我发送的内容)解释箭头键,以便在输入时插入点移动。
这在PHP中可行吗?有扩展吗?没有延期?我尝试了fgets($stream, 1)
的各种变体,但似乎PHP只是在用户输入回车键之前挂起。
答案 0 :(得分:1)
纯PHP无法使用:http://php.net/fgetc(参见评论)
答案 1 :(得分:1)
有点棘手,但是找到了使用mbstring库的方法:
// stream_set_blocking(STDIN, false); // Do not wait
while ($c = fread(STDIN, 16)) {
$c = preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($c, 'UTF-8', 'UTF-8'));
/* Up arrow */
if ($c === "[A"){
echo "UP";
}
/* Down arrow */
if ($c === "[B"){
echo "DOWN";
}
/* Right arrow */
if ($c === "[C"){
echo "RIGHT";
}
/* LEFT arrow */
if ($c === "[D"){
echo "LEFT";
}
}
隐藏外壳字符打印:
system("stty -echo");
在脚本末尾恢复:
stty echo