Преобразование ANSI escape-последовательностей в HTML с помощью PHP

Это аналогичный вопрос. Я хотел бы преобразовать escape-последовательности ANSI, особенно для цвета, в HTML. Однако я хотел бы сделать это с помощью PHP. Существуют ли какие-либо библиотеки или примеры кода, которые делают это? Если нет, что-нибудь, что может заставить меня частично перейти к такому решению?

Я не знаю никакой такой библиотеки в 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); 

Решение str_replace не будет работать в случаях, когда цвета «вложены», потому что в цветовых кодах ANSI один сброс ESC [0m – это все, что необходимо для сброса всех атрибутов. В то время как в 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: // http://stackoverflow.com/questions/1375683/converting-ansi-escape-sequences-to-html-using-php/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); 

(взято из моего номера Drush Terminal здесь: http://drupal.org/node/709742 )

Я также ищу библиотеку PHP, чтобы сделать это легко.

PS Если вы хотите преобразовать escape-последовательности ANSI в PNG / image, вы можете использовать AnsiLove .

Сейчас есть библиотека: ansi-to-html

И очень проста в использовании:

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