Konvertieren von ANSI-Escape-Sequenzen in HTML mit PHP
-
21-09-2019 - |
Frage
Dies ist eine ähnliche Frage auf dieses . Ich mag ANSI-Escape-Sequenzen konvertieren, vor allem für Farbe, in HTML. Ich möchte jedoch diese mit PHP erreichen. Gibt es Bibliotheken oder Beispielcode gibt, die das tun? Wenn nicht, irgendetwas, das mich teilweise an eine benutzerdefinierte Lösung bekommen?
Lösung
Ich weiß nicht, von einer solchen Bibliothek in PHP. Aber wenn Sie eine konsistente Eingabe mit begrenzten Farben haben, können Sie erreichen es ein einfaches str_replace()
mit:
$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);
Andere Tipps
Die str_replace Lösung nicht funktionieren würde in Fällen, in denen Farben „verschachtelt“ werden, weil in ANSI-Farbcodes, ein ESC [0m zurückgesetzt alle sind, die alle Attribute zurückgesetzt benötigt wird. Während in HTML, müssen Sie die genaue Anzahl der SPAN Endtags.
Eine Abhilfe, die funktioniert der "verschachtelte" Use Case ist unter:
// 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);
(aus meinem Drush Terminal-Problem hier: http://drupal.org/node/709742 )
Ich bin auch für die PHP-Bibliothek suche dies leicht zu tun.
P. S. Wenn Sie möchten, ANSI-Escape-Sequenzen zu PNG / Bild konvertieren, können Sie AnsiLove .
Es Bibliothek ist jetzt: ansi-to-html
Und sehr einfach zu bedienen:
$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);