Преобразование escape-последовательностей ANSI в HTML с использованием PHP
Это похоже на этот вопрос. Я хотел бы преобразовать escape-последовательности ANSI, особенно для цвета, в HTML. Тем не менее, я хотел бы сделать это с помощью PHP. Существуют ли какие-либо библиотеки или примеры кода, которые делают это? Если нет, то что-нибудь, что может помочь мне найти подходящее решение?
3 ответа
Я не знаю ни одной такой библиотеки в 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://stackru.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 здесь: http://drupal.org/node/709742)
Я также ищу библиотеку PHP, чтобы сделать это легко.
PS Если вы хотите преобразовать escape-последовательности ANSI в PNG/ изображение, вы можете использовать AnsiLove.
Сейчас есть библиотека: ansi-to-html
И очень прост в использовании:
$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);