PHP- 如何在終端輸出帶顏色的字體?

轉自: http://www.neatstudio.com/show-2568-1.shtmlphp

 

終端顯示顏色,在之前的想法當中,都是由於有了.profile的配色方案。而我通常也都是 採用默認的(snakevil是寫過一個bash帶顏色的方案的。我以爲太花哨了就沒有使用)html

爲何忽然間又想到這個?是由於在使用PHP輸出LOG的時候,千篇一率,從屏幕中找關鍵字很累,因此就想着,是否是用PHP也能夠輸出這種帶顏色的關鍵字?固然,這是由於我正好看到了一個PHP是這麼輸出的,它就是laraval,它的工具(laraval.phar)在命令行的輸出就是有不一樣顏色的,它給了我指引,意思就是,這個想法是能夠實現的。python

OK。找資料,知道在終端中用指定的字符來作爲背景色和字體色(http://blog.csdn.net/acmee/article/details/6613060)git

文中這樣介紹:github

 

1、shell下的實現方法  shell

       先來說在shell下,如何實現。用echo命令就能夠實現,參看如下例子:  編程

       

echo  -e  "\033[32mHello, world!"  

  

  1. 當你在終端裏敲下這條命令後,是否是發現系統用綠色輸出了"Hello,world!",不止如此,連以後的命令提示符都變成了綠色?不要着急,聽我繼續說。echo命令-e選項的做用是激活終端對反斜線轉義符(即\)的解釋。引號內\033用於引導很是規字符序列,在這裏的做用就是引導設置輸出屬性,後邊的[32m就是將前景色設置爲綠色,字母m表示設置的屬性類別,數字表明屬性值。設置能夠單獨使用,例如:  
  2.        echo -e  "\033[0m"  
  3.        這行命令的做用是恢復屬性爲默認值,也就是說0m設置項用於恢復默認值。如今你的終端是否是又一切正常了?  
  4.        理解了這些,剩下的就簡單了。用這種命令,除了設置文本前景色,還能夠設置不少屬性。下邊列出其餘的設置項:  
  5.       --------------------------------------------------------------------------  
  6.       \033[0m 關閉全部屬性  
  7.       \033[1m 設置高亮度  
  8.       \033[4m 下劃線  
  9.       \033[5m 閃爍  
  10.       \033[7m 反顯  
  11.       \033[8m 消隱  
  12.       \033[30m 至 \33[37m 設置前景色  
  13.       \033[40m 至 \33[47m 設置背景色  
  14.       \033[nA 光標上移n行   
  15.       \033[nB 光標下移n行  
  16.       \033[nC 光標右移n行  
  17.       \033[nD 光標左移n行  
  18.       \033[y;xH設置光標位置  
  19.       \033[2J 清屏  
  20.       \033[K 清除從光標到行尾的內容  
  21.       \033[s 保存光標位置   
  22.       \033[u 恢復光標位置  
  23.       \033[?25l 隱藏光標  
  24.       \033[?25h 顯示光標  
  25.       --------------------------------------------------------------------------  
  26.       各數字所表明的顏色以下:  
  27.       字背景顏色範圍:40----49  
  28.       40:黑  
  29.       41:深紅  
  30.       42:綠  
  31.       43:黃色  
  32.       44:藍色  
  33.       45:紫色  
  34.       46:深綠  
  35.       47:白色  
  36.       字顏色:30-----------39  
  37.       30:黑  
  38.       31:紅  
  39.       32:綠  
  40.       33:黃  
  41.       34:藍色  
  42.       35:紫色  
  43.       36:深綠   
  44.       37:白色  
  45.       另外,同類的多種設置項能夠組合在一塊兒,中間用分號(;)隔開。以下:  
  1.  echo -e "\033[20;1H\033[1;4;32mHello,world\033[0m"  
    
  2.       這行命令首先\033[20;1H將光標移動到終端第20行第1列,以後的\033[1;4;32m將文本屬性設置爲高亮、帶下劃線且顏色爲綠色,而後輸出Hello,world;最後\033[0m將終端屬性恢復爲默認值,這樣就不會看到連命令完成後的命令提示符也變了樣兒了。  
  3.       經過以上各類命令的組合就能夠實現對終端輸出地複雜控制。  
  4. 2、如何在C編程中實現?  
  5.       理解了以上在Shell中的實現方法,關於在C中如何實現就很簡單了。能夠說只須要用printf函數代替上邊的echo -e就OK了。參見下例:  
  6.  int color = 32;  
     printf("\033[20;1H\033[1;4;%dmHello, world.\033[0m", color);  
    
  7.       這個例子相似上邊shell中最後那個例子,只是這裏顏色值經過變量color來指定(固然,也能夠直接指定)。  
  8. 3、聯想  
  9.       看到這裏你可能會想,是否是在其餘編程語言裏也能夠用相似的方法實現對終端輸出的控制呢?答案是確定的!好比在python中,能夠以下輸出:  
    color=32  
    print 「\033[20;1H\033[1;4;%dHello, world.\033[0m"%color  
    
  10.       這個例子的效果跟上邊C的例子是相同的。  

 

其實在看到這一段以前,snakevil在本身的github的項目(https://github.com/snakevil/bashrc.x)中也介紹過,其實我相對仍是喜歡ubuntu的默認配色,snakevil的這個配色我是真心不是特別喜歡。。ubuntu

但究竟怎麼用PHP輸出呢?在用PHP輸出以前,找了一下網絡,發現已經有有用perl實現過了。那麼說實在的。若是沒有使用到一些特別的函數,其實php和perl實在是太象了,因此,能夠直接參考(http://perldoc.perl.org/Term/ANSIColor.html),這裏的代碼,除了那個類外,都仍是能夠復刻的。因而,再隨便找了點,果真仍是有現成的PHP代碼的(http://www.if-not-true-then-false.com/2010/php-class-for-coloring-php-command-line-cli-scripts-output-php-output-colorizing-using-bash-shell-colors/)bash

好吧。這個URL太長了。仍是直接貼代碼吧:網絡

class Colors {  

    private $foreground_colors = array();  

    private $background_colors = array();  

    public function __construct() {  

        // Set up shell colors  

        $this->foreground_colors['black'] = '0;30';  
        $this->foreground_colors['dark_gray'] = '1;30';  
        $this->foreground_colors['blue'] = '0;34';  
        $this->foreground_colors['light_blue'] = '1;34';  
        $this->foreground_colors['green'] = '0;32';  
        $this->foreground_colors['light_green'] = '1;32';  
        $this->foreground_colors['cyan'] = '0;36';  
        $this->foreground_colors['light_cyan'] = '1;36';  
        $this->foreground_colors['red'] = '0;31';  
        $this->foreground_colors['light_red'] = '1;31';  
        $this->foreground_colors['purple'] = '0;35';  
        $this->foreground_colors['light_purple'] = '1;35';  
        $this->foreground_colors['brown'] = '0;33';  
        $this->foreground_colors['yellow'] = '1;33';  
        $this->foreground_colors['light_gray'] = '0;37';  
        $this->foreground_colors['white'] = '1;37';  
        $this->background_colors['black'] = '40';  
        $this->background_colors['red'] = '41';  
        $this->background_colors['green'] = '42';  
        $this->background_colors['yellow'] = '43';  
        $this->background_colors['blue'] = '44';  
        $this->background_colors['magenta'] = '45';  
        $this->background_colors['cyan'] = '46';  
        $this->background_colors['light_gray'] = '47';  
    }  

    // Returns colored string  

    public function getColoredString($string, $foreground_color = null, $background_color = null) {  
        $colored_string = "";  
        
        // Check if given foreground color found  
        if (isset($this->foreground_colors[$foreground_color])) {  
            $colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";  
        }  

        // Check if given background color found  

        if (isset($this->background_colors[$background_color])) {  
            $colored_string .= "\033[" . $this->background_colors[$background_color] . "m";  
        }  

        // Add string and end coloring  
        $colored_string .=  $string . "\033[0m";  
        return $colored_string;  
    }  

    // Returns all foreground color names  
    public function getForegroundColors() {  
        return array_keys($this->foreground_colors);  
    }  

    // Returns all background color names  

    public function getBackgroundColors() {  
        return array_keys($this->background_colors);  

    }  
}  
 

用法也比較簡單:

PHP代碼
 // Create new Colors class  
    $colors = new Colors();  
   
    // Test some basic printing with Colors class  
    echo $colors->getColoredString("Testing Colors class, this is purple string on yellow background.", "purple", "yellow") . "\n";  
    echo $colors->getColoredString("Testing Colors class, this is blue string on light gray background.", "blue", "light_gray") . "\n";  
    echo $colors->getColoredString("Testing Colors class, this is red string on black background.", "red", "black") . "\n";  
    echo $colors->getColoredString("Testing Colors class, this is cyan string on green background.", "cyan", "green") . "\n";  
    echo $colors->getColoredString("Testing Colors class, this is cyan string on default background.", "cyan") . "\n";  
    echo $colors->getColoredString("Testing Colors class, this is default string on cyan background.", null, "cyan") . "\n"; 

固然,若是你以爲這個代碼太麻煩,還有一個簡單的方法:

function colorize($text, $status) {  
 $out = "";  
 switch($status) {  
  case "SUCCESS":  
   $out = "[42m"; //Green background  
   break;  
  case "FAILURE":  
   $out = "[41m"; //Red background  
   break;  
  case "WARNING":  
   $out = "[43m"; //Yellow background  
   break;  
  case "NOTE":  
   $out = "[44m"; //Blue background  
   break;  
  default:  
   throw new Exception("Invalid status: " . $status);  
 }  
 return chr(27) . "$out" . "$text" . chr(27) . "[0m";  
}  
  
echo colorize("Your command was successfully executed...", "SUCCESS");  

 

四種顏色也夠了。不過。。。NOTE的blue background。。。若是你的字符仍是黑色的,真心看不到字符串了。

至此,介紹完畢,你能夠試試(我已經用在項目中了)

 

 

相關文章
相關標籤/搜索