PHPを使用してHTMLにANSIエスケープシーケンスの変換
-
21-09-2019 - |
質問
これは<のhref =「https://stackoverflow.com/questions/245121/a-library-to-convert-ansi-escapes-terminal-formatting-color-codes-to-html」と同様の質問です>この1 を。私は、HTMLの中に、特に色のために、ANSIエスケープシーケンスを変換したいと思います。しかし、私は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カラーコードでは、1 ESC [0メートルのリセットはすべての属性をリセットするために必要だということすべてですので色は、「ネストされた」されている場合は動作しません。 HTMLでいる間、あなたは、SPANの終了タグの正確な数を必要とします。
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);
(ここでは私のDrushターミナルの問題から撮影: http://drupal.org/node/709742する )
私も簡単にこれを行うためのPHPライブラリを探しています。
P.S。あなたはPNG /画像にANSIエスケープシーケンスを変換したい場合は、 AnsiLove を使用することができます。
ライブラリが存在することになります: ANSI-TO-HTML の
、非常に使いやすいます:
$converter = new AnsiToHtmlConverter();
$html = $converter->convert($ansi);