使用PHP将ANSI转义序列转换为HTML

8

这是一个类似于这个问题的问题。我想将ANSI转义序列,尤其是颜色,转换为HTML。然而,我想使用PHP来完成这个任务。是否有任何库或示例代码可以实现这一点?如果没有,是否有任何东西可以让我部分地实现自定义解决方案?

3个回答

8

在 ANSI 颜色代码中,只需要一个 ESC[0m 重置指令即可重置所有属性,因此 str_replace 解决方案无法处理“嵌套”颜色的情况。而在 HTML 中,您需要恰好数量的 SPAN 关闭标记才能实现相同的效果。

一种解决“嵌套”颜色用例的方法如下:

  // Ugly hack to process the color codes
  // We need something like Perl's HTML::FromANSI
  // http://search.cpan.org/perldoc?HTML%3A%3AFromANSI
  // but for PHP
  // http://ansilove.sourceforge.net/ only converts to image :(
  // Technique below is from:
  // https://dev59.com/7knSa4cB1Zd3GeqPLzJ5#2233231
  $output = preg_replace("/\x1B\[31;40m(.*?)(\x1B\[0m)/", '<span style="color: red">$1</span>$2', $output);
  $output = preg_replace("/\x1B\[1m(.*?)(\x1B\[0m)/", '<b>$1</b>$2', $output);
  $output = preg_replace("/\x1B\[0m/", '', $output);

我也在寻找可以轻松完成此操作的PHP库。

另外,如果您想将ANSI转义序列转换为PNG / 图像,则可以使用 AnsiLove

(摘自我的Drush终端问题:http://drupal.org/node/709742


5

现在有一个库:ansi-to-html

而且非常容易使用:

$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);

4

我不知道PHP中是否有这样的库。但是,如果您有一致的输入并且颜色有限,您可以使用简单的str_replace()函数来完成:

$dictionary = array(
    'ESC[01;34' => '<span style="color:blue">',
    'ESC[01;31' => '<span style="color:red">',
    'ESC[00m'   => '</span>' ,
);
$htmlString = str_replace(array_keys($dictionary), $dictionary, $shellString);

我真的在寻找一个更通用的解决方案,但这个不错,我可能最终会选择这条路。 - Travis Beale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接