转自: http://www.neatstudio.com/show-2568-1.shtml

终端显示颜色,在以前的想法当中,都是因为有了.profile的配色方案。而我一般也都是 采用默认的(snakevil是写过一个bash带颜色的方案的。我觉得太花哨了就没有使用)

为什么突然间又想到这个?是因为在使用PHP输出LOG的时候,千篇一率,从屏幕中找关键字很累,所以就想着,是不是用PHP也可以输出这种带颜色的关键字?当然,这是因为我正好看到了一个PHP是这么输出的,它就是laraval,它的工具(laraval.phar)在命令行的输出就是有不同颜色的,它给了我指引,意思就是,这个想法是可以实现的。

OK。找资料,知道在终端中用指定的字符来做为背景色和字体色(http://blog.csdn.net/acmee/article/details/6613060)

文中这样介绍:

 

一、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. 二、如何在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. 三、联想
  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的这个配色我是真心不是特别喜欢。。

但究竟怎么用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/)

好吧。这个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。。。如果你的字符还是黑色的,真心看不到字符串了。

至此,介绍完毕,你可以试试(我已经用在项目中了)

PHP- 如何在终端输出带颜色的字体?的更多相关文章

  1. php 扫描url死链接 \033[31m ANSI Linux终端输出带颜色

    * 从Packagist上搜索需要的包 https://packagist.org/ * 通过composer下载依赖包 composer require guzzlehttp/guzzlecompo ...

  2. shell脚本 ------ 输出带颜色的字体

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e “\033[字背景颜色:文字颜色m字符串\033[0m” 例如: echo -e “\03 ...

  3. Python3使用Print输出带颜色字体

    Phton3使用print输出带颜色的彩色字体 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\03 ...

  4. (转)shell脚本输出带颜色字体

    shell脚本输出带颜色字体 原文:http://blog.csdn.net/andylauren/article/details/60873400 输出特效格式控制:\033[0m  关闭所有属性  ...

  5. 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

    背景 ​ 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目.提示的目的,那么如何在Linux终端输出带有颜色的字体呢? Linux终端输出字符颜色 ​ ...

  6. python-pycharm控制台输出带颜色

    python_控制台输出带颜色的文字方法   在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信 ...

  7. python 控制台输出带颜色的文字的方法

    python_控制台输出带颜色的文字方法   在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信 ...

  8. shell 终端字符颜色

    终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关,shell,python,perl等均可以调用. 转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC ...

  9. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...

随机推荐

  1. windows10家庭版升级专业版/企业版

    以防万一,还是把Windows10家庭版的密钥保存下来. 一.保留原密钥 1. Win+R,输入regedit 2. 进入目录 HKEY_LOCAL_MACHINE\SOFTWARE\Microsof ...

  2. Event 事件(最简单实用)

    public partial class Form1 : Form { /// <summary> /// 定义事件 /// </summary> public event E ...

  3. cronicle minio s3 存储配置集成

    cronicle 后端存储是可配置的 ,通过使用不同的存储配置,我们可以解决多实例部署以及数据共享的问题 cronicle 的后端存储模型,设计的特别方便,包含了基于文件的,基于s3 的,同时我们也可 ...

  4. for、for...in、for...of的区别

    当有一个元素未定义时,for和for...of遍历该元素为undefined,for...in遍历不到. 如果是自定义属性,for和for...of无法遍历,for...in可以遍历. for...i ...

  5. url的组成部分

    /news/index.asp?boardID=5&ID=24618&page=1#name 协议:http: //为分隔符 域名:www.aspxfans.com :为域名和端口之间 ...

  6. python使用jieba实现中文文档分词和去停用词

    分词工具的选择: 现在对于中文分词,分词工具有很多种,比如说:jieba分词.thulac.SnowNLP等.在这篇文档中,笔者使用的jieba分词,并且基于python3环境,选择jieba分词的理 ...

  7. django 下载文件,指定文件中文名称

    Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用户请求所得的内容存为一个 ...

  8. shell for循环输出目录下的文件名

    test.sh文件: #!/bin/bash for file in `ls`;do echo $file done 输出 bogon:test macname$ chmod +x test.sh b ...

  9. 代码审计和动态测试——BUUCTF - 高明的黑客

    根据题目提示,访问http://2ea746a2-0ecd-449b-896b-e0fb38956134.node1.buuoj.cn/www.tar.gz下载源码 解压之后发现有3002个php文件 ...

  10. 记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)

    题目很简单,一个滑稽 打开源码,发现存在source.php文件 于是访问文件,发现出现一串php源码 提示存在hint.php,于是访问发现一句话 flag not here, and flag i ...