PHP:为STDIN /单字符处理添加箭头键支持

时间:2016-02-15 19:38:43

标签: php command-line-interface stdin readline

在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只是在用户输入回车键之前挂起。

2 个答案:

答案 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