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

StackOverflow https://stackoverflow.com/questions/1375683

Вопрос

Это аналогичный вопрос Вот этот.Я хотел бы преобразовать 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, чтобы сделать это легко.

P.S.Если вы хотите преобразовать escape-последовательности ANSI в PNG/изображение, вы можете использовать АнсиЛюбовь.

Сейчас есть библиотека: преобразование Ansi в HTML

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

$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top