Questa è una domanda simile a this one. Mi piacerebbe convertire sequenze di escape ANSI, in particolare per il colore, in HTML. Tuttavia, mi piacerebbe farlo usando PHP. Ci sono librerie o codici di esempio là fuori che fanno questo? In caso contrario, tutto ciò che può farmi parzialmente a una soluzione personalizzata?Conversione di sequenze di escape ANSI in HTML utilizzando PHP
risposta
Non conosco alcuna libreria di questo tipo in PHP. Ma se si dispone di un ingresso in linea con i colori limitati, si può realizzare utilizzando un semplice 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);
La soluzione str_replace non avrebbe funzionato nei casi in cui i colori sono "annidati", perché in codici colore ANSI, uno ESC [0m reset è tutto ciò che è necessario per ripristinare tutti gli attributi. In HTML, è necessario il numero esatto dei tag di chiusura SPAN.
Una soluzione che funziona "annidata" caso d'uso è di seguito:
// 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);
(preso dal mio problema Drush Terminal qui: http://drupal.org/node/709742)
Sto anche cercando la libreria PHP per farlo questo facilmente.
P.S. Se si desidera convertire sequenze di escape ANSI in PNG/immagine, è possibile utilizzare AnsiLove.
ci sono biblioteca ora: ansi-to-html
e molto facile da usare:
$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);
Sto davvero cercando una soluzione più generale, ma questo è buono e io possa finire per andare in questo percorso. –