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

PHP:向STDIN/单字符处理添加箭头键支持,php,command-line-interface,stdin,readline,Php,Command Line Interface,Stdin,Readline,在PHP中,我可以使用以下代码从命令行程序读入输入 $stream = STDIN; $test = fgets($stream); echo $test; 这对于简单的输入很有效。但是,如果我尝试使用类似于返回箭头键的东西,我的shell如下所示 This is a test^[[D^[[D^[[D i、 例如,^[[D的箭头键转义序列被发送到shell。PHP本身将解释箭头键——即输入 This is a test^[[D^[[D^[[D^[[Dsecond test

在PHP中,我可以使用以下代码从命令行程序读入输入

$stream = STDIN;
$test = fgets($stream);
echo $test;
这对于简单的输入很有效。但是,如果我尝试使用类似于返回箭头键的东西,我的shell如下所示

This is a test^[[D^[[D^[[D    
i、 例如,
^[[D
的箭头键转义序列被发送到shell。PHP本身将解释箭头键——即输入

This is a test^[[D^[[D^[[D^[[Dsecond test     
将输出此

This is a second test
但是,我希望shell“正确”(即,执行我认为他们应该执行的操作,而不是执行我发送的操作)解释箭头键,以便在键入时插入点移动


这在PHP中是可能的吗?有扩展吗?没有扩展吗?我尝试了不同的
fgets($stream,1)
,但似乎PHP只是挂起,直到用户输入enter键。

纯PHP不行:(请参阅注释)

有点棘手,但找到了使用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

多年来我都在尝试,我希望有人能找到解决办法!