2009-09-03 31 views
7

Đây là câu hỏi tương tự với this one. Tôi muốn chuyển đổi các chuỗi thoát ANSI, đặc biệt là màu sắc, thành HTML. Tuy nhiên, tôi muốn thực hiện điều này bằng cách sử dụng PHP. Có bất kỳ thư viện hoặc mã ví dụ nào ở đó thực hiện việc này không? Nếu không, bất cứ điều gì có thể giúp tôi trở thành một phần của giải pháp tùy chỉnh?Chuyển đổi chuỗi ANSI thoát sang HTML bằng cách sử dụng PHP

Trả lời

3

Tôi không biết bất kỳ thư viện nào như vậy trong PHP. Nhưng nếu bạn có một đầu vào phù hợp với màu sắc hạn chế, bạn có thể thực hiện nó bằng cách sử dụng đơn giản 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); 
+0

Tôi đang thực sự tìm kiếm một giải pháp tổng quát hơn, nhưng điều này là tốt và tôi có thể kết thúc đi tuyến đường này. –

7

Giải pháp str_replace sẽ không hoạt động trong trường hợp màu sắc được "lồng", bởi vì trong mã màu ANSI, một ESC [0m reset là tất cả những gì cần thiết để thiết lập lại tất cả các thuộc tính. Trong khi ở dạng HTML, bạn cần số thẻ đóng SPAN chính xác.

Một cách giải quyết mà các công trình trường hợp sử dụng "lồng" là dưới đây:

// 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); 

(lấy từ Drush Terminal của tôi vấn đề ở đây: http://drupal.org/node/709742)

Tôi cũng đang tìm kiếm các thư viện PHP để làm điều này một cách dễ dàng.

P.S. Nếu bạn muốn chuyển đổi chuỗi ANSI thoát thành PNG/hình ảnh, bạn có thể sử dụng AnsiLove.

2

Có thư viện bây giờ: ansi-to-html

Và rất dễ sử dụng:

$converter = new AnsiToHtmlConverter(); 
$html = $converter->convert($ansi); 
Các vấn đề liên quan