Conversione sequenze di escape ANSI in HTML con PHP
-
21-09-2019 - |
Domanda
Questa è una domanda simile a questo . Vorrei convertire sequenze di escape ANSI, in particolare per il colore, in HTML. Tuttavia, vorrei per raggiungere questo obiettivo utilizzando PHP. Ci sono delle librerie o codice di esempio là fuori che fare questo? In caso contrario, tutto ciò che mi può ottenere modo parte per una soluzione personalizzata?
Soluzione
Non so di qualsiasi libreria 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);
Altri suggerimenti
La soluzione str_replace non avrebbe funzionato nei casi in cui i colori sono "annidati", perché in codici colore ANSI, uno ESC [Reset 0m è tutto ciò che serve per ripristinare tutti gli attributi. Mentre in HTML, è necessario il numero esatto di tag di chiusura SPAN.
Una soluzione che funziona "annidata" caso d'uso è inferiore a:
// 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 )
Sono anche alla ricerca per la libreria PHP per farlo facilmente.
P.S. Se si desidera convertire le sequenze di escape ANSI PNG / immagine, è possibile utilizzare AnsiLove .
Ci sono biblioteca ora: ANSI-to-HTML
E molto facile da usare:
$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);