7

これは、この質問と同様の質問です。ANSI エスケープ シーケンス、特に色を HTML に変換したいと考えています。ただし、PHPを使用してこれを実現したいと考えています。これを行うライブラリやサンプルコードはありますか? そうでない場合、カスタム ソリューションへの途中で役立つものはありますか?

4

3 に答える 3

8

色が「ネスト」されている場合、str_replace ソリューションは機能しません。これは、ANSI カラー コードでは、すべての属性をリセットするために 1 つの 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 ターミナルの問題から引用: http://drupal.org/node/709742 )

これを簡単に行うための PHP ライブラリも探しています。

PS ANSI エスケープ シーケンスを PNG/image に変換する場合は、AnsiLoveを使用できます。

于 2010-02-09T23:12:08.770 に答える
4

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);
于 2009-09-03T20:25:02.360 に答える