当前位置:首页 > PHP教程 > php高级应用 > 列表

学习PHP-cli 模式在终端输出彩色标记文字以及动态内容

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-03 09:13:34 浏览: 评论:0 

文字的各种效果标记写法

字体颜色与背景色

\033[30m 至 \33[37m 设置前景色 

\033[40m 至 \33[47m 设置背景色 

例如 echo "\033[30m  this is a test msg  \033[0m".PHP_EOL;

echo "\033[45m  this is a test msg  \033[0m".PHP_EOL;

文字背景颜色范围:

40:黑 

41:深红 

42:绿 

43:黄色 

44:蓝色 

45:紫色 

46:深绿 

47:白色 

文字颜色:

30:黑 

31:红 

32:绿 

33:黄 

34:蓝色 

35:紫色 

36:深绿   

37:白色

标记闭合

所有效果在文本结尾处要加上闭合的标记:\033[0m;

文字高亮等其他效果

\033[1m 文字高亮

\033[4m 下划线

\033[5m 闪烁

\033[7m 反显

\033[8m 消隐

多种效果组合使用

多种效果组合使用时用英文分号隔开,例如蓝底红字下划线加闪烁

echo "\033[44;31;4m  this is a test msg  \033[0m".PHP_EOL;

光标的移动与设置

移动

\033[nA 光标上移n行   

\033[nB 光标下移n行 

\033[nC 光标右移n行 

\033[nD 光标左移n行

设置

\033[y;xH设置光标位置 

\033[2J 清屏 

\033[K 清除从光标到行尾的内容 

\033[s 保存光标位置   

\033[u 恢复光标位置 

\033[?25l 隐藏光标 

\033[?25h 显示光标

简单的实现

文字效果操作类

  1. namespace Console;class Style{ 
  2.  
  3.      private $colors = [ 
  4.  
  5.          "black"=>30, 
  6.  
  7.          "red"=>31, 
  8.  
  9.          "green"=>32, 
  10.  
  11.          "yellow"=>33, 
  12.  
  13.          "blue"=>34, 
  14.  
  15.          "purple"=>35, 
  16.  
  17.          "darkGreen"=>36, 
  18.  
  19.          "white"=>37, 
  20.  
  21.      ]; 
  22.  
  23.      private $backgrounds = [ 
  24.  
  25.          "black"=>40, 
  26.  
  27.          "darkRed"=>41, 
  28.  
  29.          "green"=>42, 
  30.  
  31.          "yellow"=>43, 
  32.  
  33.          "blue"=>44, 
  34.  
  35.          "purple"=>45, 
  36.  
  37.          "darkGreen"=>46, 
  38.  
  39.          "white"=>47, 
  40.  
  41.      ]; 
  42.  
  43.  
  44.  
  45.      public $msg
  46.  
  47.      public $style = []; 
  48.  
  49.      public function __construct($msg){ 
  50.  
  51.          $this->msg = $msg
  52.  
  53.      } 
  54.  
  55.      // 设置文本颜色 
  56.  
  57.      public function color( string $c ){ 
  58.  
  59.          if( isset( $this->colors[$c]) ) $this->style[] = $this->colors[$c]; 
  60.  
  61.          return $this
  62.  
  63.      } 
  64.  
  65.      // 设置背景色 
  66.  
  67.      public function bg( string $c ){ 
  68.  
  69.          if(isset($this->backgrounds[$c]) ) $this->style[] = $this->backgrounds[$c]; 
  70.  
  71.          return $this
  72.  
  73.      } 
  74.  
  75.      // 高亮 
  76.  
  77.      public function highLight(){ 
  78.  
  79.          $this->style[] = 1; 
  80.  
  81.          return $this
  82.  
  83.      } 
  84.  
  85.      // 下划线 
  86.  
  87.      public function underLine(){ 
  88.  
  89.          $this->style[] = 4; 
  90.  
  91.          return $this
  92.  
  93.      } 
  94.  
  95.      // 闪烁 
  96.  
  97.      public function twinkle(){ 
  98.  
  99.          $this->style[] = 5; 
  100.  
  101.          return $this
  102.  
  103.      } 
  104.  
  105.      // 反显 
  106.  
  107.      public function rshow(){ 
  108.  
  109.          $this->style[] = 7; 
  110.  
  111.          return $this
  112.  
  113.      } 
  114.  
  115.      //  消隐 
  116.  
  117.      public function hide(){ 
  118.  
  119.          $this->style[] = 8; 
  120.  
  121.          return $this
  122.  
  123.      } 
  124.  
  125.  
  126.  
  127.      public function toString(){ 
  128.  
  129.          $this->style = array_unique($this->style); 
  130.  
  131.          if($this->msg){ 
  132.  
  133.              if(sizeof($this->style)  ){ 
  134.  
  135.                  return "\033[".implode(';',$this->style)."m"  . $this->msg . "\033[0m"
  136.  
  137.              }else
  138.  
  139.                  return $this->msg. "\033[0m"
  140.  
  141.              } 
  142.  
  143.          }else
  144.  
  145.              return false; 
  146.  
  147.          } 
  148.  
  149.      } 
  150.  
  151.  } 

光标操作类

  1. namespace Console; 
  2.  
  3.  
  4.  
  5.  // 光标的信息以及操作 
  6.  
  7.  class Cursor{ 
  8.  
  9.      // 光标设置 \033[y;xH 
  10.  
  11.      private $x=0; 
  12.  
  13.      private $y=0; 
  14.  
  15.      // 获取光标X轴位置 
  16.  
  17.      public function offsetX(){ 
  18.  
  19.          return $this->x; 
  20.  
  21.      } 
  22.  
  23.      // 获取光标Y轴位置 
  24.  
  25.      public function offsetY(){ 
  26.  
  27.          return $this->y; 
  28.  
  29.      } 
  30.  
  31.  
  32.  
  33.      // 获取光标坐标 
  34.  
  35.      public function offset(){ 
  36.  
  37.          return [ 
  38.  
  39.              'x'=>$this->x, 
  40.  
  41.              'y'=>$this->y, 
  42.  
  43.          ]; 
  44.  
  45.      } 
  46.  
  47.      public function setX( int $x ){ 
  48.  
  49.          $this->x = $x
  50.  
  51.      } 
  52.  
  53.  
  54.  
  55.      public function setY( int $y ){ 
  56.  
  57.          $this->y = $y
  58.  
  59.      } 
  60.  
  61.  
  62.  
  63.      public function setOffset( int $x , int $y ){ 
  64.  
  65.          $this->x = $x
  66.  
  67.          $this->y = $y
  68.  
  69.          return $this->toString(); 
  70.  
  71.      } 
  72.  
  73.      // 清屏 
  74.  
  75.      public function clear(){ 
  76.  
  77.          return "\033[2J"
  78.  
  79.      } 
  80.  
  81.  
  82.  
  83.      public function show(){ 
  84.  
  85.          return "\33[?25h"
  86.  
  87.      } 
  88.  
  89.      public function hide(){ 
  90.  
  91.          return "\33[?25l"
  92.  
  93.      } 
  94.  
  95.  
  96.  
  97.      public function toString(){ 
  98.  
  99.          if($this->x<0)$dx = 'D'
  100.  
  101.          else $dx = 'C'
  102.  
  103.          if($this->y<0)$dy = 'A'
  104.  
  105.          else $dy = 'B'
  106.  
  107.          $absx = abs($this->x); 
  108.  
  109.          $absy = abs($this->y); 
  110.  
  111.          return "\033[{$absx}{$dx}\033[{$absy}{$dy}"
  112.  
  113.      } 
  114.  
  115.  } 

table类,通便html的table标记语言,输出table

  1. namespace Console;class Table{ 
  2.  
  3.      public $table=[]; 
  4.  
  5.      private $getV
  6.  
  7.      private $currentTag='table'
  8.  
  9.      private $props = [ 
  10.  
  11.          'color','bg','twinkle','highLight','underLine','colspan','rowspan','width','border','align' 
  12.  
  13.      ]; 
  14.  
  15.      public function __construct( string $html){ 
  16.  
  17.          // 解析字符串最好 
  18.  
  19.          $this->html=$html
  20.  
  21.          $this->parse(); 
  22.  
  23.      } 
  24.  
  25.      // 解析字符串 将table的每个tr td以及属性都解析出来  
  26.  
  27.      private function parse(){ 
  28.  
  29.          if( !preg_match("/<table(\s+.*?)?>(.*?)<\/table>/is",$this->html) || !preg_match("/<tr(\s+.*?)?>(.*?)<\/tr>/is",$this->html) || !preg_match("/<td(\s+.*?)?>(.*?)<\/td>/is",$this->html) ){ 
  30.  
  31.              die('标签有误,必须包含table tr  td标签且标签闭合'); 
  32.  
  33.          } 
  34.  
  35.  
  36.  
  37.          $this->table['html'] = $this->html; 
  38.  
  39.          $this->getPrototype('table',$this->table); 
  40.  
  41.          preg_match_all("/<table(\s+.*?)?>(.*?)<\/table>/is",$this->html,$innerTable); 
  42.  
  43.          if$innerTable[0][0] ){ 
  44.  
  45.              preg_match_all("/<tr(\s+.*?)?>(.*?)<\/tr>/is",$this->html,$trList); 
  46.  
  47.              if$trList[0] ){ 
  48.  
  49.                  $this->table['tr'] = $trList[0]; 
  50.  
  51.                  foreach($this->table['tr'as $k=>$tr){ 
  52.  
  53.                      $this->table['tr'][$k] = []; 
  54.  
  55.                      preg_match_all("/<td(\s+.*?)?>(.*?)<\/td>/is",$tr,$tdList); 
  56.  
  57.                      $this->table['tr'][$k]['td'] = $tdList[0]; 
  58.  
  59.                      $this->table['tr'][$k]['html'] =$tr
  60.  
  61.                      $this->getPrototype('tr',$this->table['tr'][$k]); 
  62.  
  63.                      foreach ($this->table['tr'][$k]['td'as $kk=>$td){ 
  64.  
  65.                          $this->table['tr'][$k]['td'][$kk] = [ 
  66.  
  67.                              'html'=>$td
  68.  
  69.                              'content'=>$tdList[2][$kk
  70.  
  71.                          ]; 
  72.  
  73.                          $this->getPrototype('td',$this->table['tr'][$k]['td'][$kk]); 
  74.  
  75.                      } 
  76.  
  77.                  } 
  78.  
  79.              }else
  80.  
  81.                  die('Tr 不存在'); 
  82.  
  83.              } 
  84.  
  85.          }else
  86.  
  87.              die('Table 不存在'); 
  88.  
  89.          } 
  90.  
  91.      } 
  92.  
  93.      private function getPrototype(string $tag,&$v){ 
  94.  
  95.          preg_match("/<{$tag}(\s.*?)?>(.*?)<\/{$tag}>/is",$v['html'],$arr); 
  96.  
  97.          if(strlen($arr[1])){ 
  98.  
  99.              $arr2 = explode(" ", trim(preg_replace("/( +)/is"," ",$arr[1]))); 
  100.  
  101.              foreach ($arr2 as $arr3){ 
  102.  
  103.                  $arr4 = explode('=',str_replace([' ',"\"","\'"],'',$arr3)); 
  104.  
  105.                  if(in_array($arr4[0],$this->props)){ 
  106.  
  107.                      $v[$arr4[0]] = $arr4[1]; 
  108.  
  109.                  } 
  110.  
  111.              } 
  112.  
  113.          } 
  114.  
  115.      } 
  116.  
  117.  } 

console类,输出自定义的文本或table格式文本

  1. namespace Console;class Console{ 
  2.  
  3.      public $cursor
  4.  
  5.      private $msgList=[]; 
  6.  
  7.      private $lastCountLine=0; 
  8.  
  9.      public function __construct(){ 
  10.  
  11.          $this->cursor= new Cursor(); 
  12.  
  13.      } 
  14.  
  15.  
  16.  
  17.      private static function getStrlen($str){ 
  18.  
  19.          if(!$strreturn 0; 
  20.  
  21.          $l=0; 
  22.  
  23.          $strArr = preg_split('//u',$str,-1, PREG_SPLIT_NO_EMPTY); 
  24.  
  25.          if(is_array($strArr)){ 
  26.  
  27.              foreach($strArr as $v){ 
  28.  
  29.                  if(preg_match("/^[\x{4e00}-\x{9fa5}]$/u"$v)) $l += 2; 
  30.  
  31.                  else $l += 1; 
  32.  
  33.              } 
  34.  
  35.          } 
  36.  
  37.          return $l
  38.  
  39.      } 
  40.  
  41.  
  42.  
  43.      public function write($msg){ 
  44.  
  45.          $msgStyle = new Style($msg); 
  46.  
  47.          $this->msgList[] =  $msgStyle
  48.  
  49.          return  $msgStyle
  50.  
  51.      } 
  52.  
  53.  
  54.  
  55.      public function table(array $table){ 
  56.  
  57.          foreach($table['tr'as $tr){ 
  58.  
  59.  
  60.  
  61.              foreach($tr['td'as $td){ 
  62.  
  63.                  if($td['content']){ 
  64.  
  65.                      $len = self::getStrlen($td['content']); // 显示问题矫正 
  66.  
  67.                      $tdlen = $td['width'] ?? max(15,$len); 
  68.  
  69.                      $tdlen = max($tdlen,$len); 
  70.  
  71.                      $align = $td['align'] ??$tr['align']??$table['align']?? false; 
  72.  
  73.                      if$tdlen>$len ){ 
  74.  
  75.                          if$align=='left'){ 
  76.  
  77.                              $td['content'] =  $td['content'].str_repeat(' ',$tdlen-$len); 
  78.  
  79.                          }else if($align=='right'){ 
  80.  
  81.                              $td['content'] = str_repeat(' ',$tdlen-$len) . $td['content']; 
  82.  
  83.                          }else
  84.  
  85.                              $td['content'] = str_repeat(' ',floor(($tdlen-$len)/2)) . $td['content'] . str_repeat(' ',ceil(($tdlen-$len)/2)); 
  86.  
  87.                          } 
  88.  
  89.                      } 
  90.  
  91.                      $msg = $this->write($td['content']); 
  92.  
  93.                      $color = $td['color']  ??   $tr['color'] ??$table['color']??false; 
  94.  
  95.                      $twinkle = $td['twinkle']  ??   $tr['twinkle'] ??$table['twinkle']??false; 
  96.  
  97.                      $bg  = $td['bg ']  ??   $tr['bg '] ??$table['bg ']??false; 
  98.  
  99.                      $highLight = $td['highLight']  ??   $tr['highLight'] ??$table['highLight']??false; 
  100.  
  101.                      $underLine = $td['underLine']  ??   $tr['underLine'] ??$table['underLine']??false; 
  102.  
  103.  
  104.  
  105.                      if($color$msg->color($color); 
  106.  
  107.                      if($bg$msg->bg($bg); 
  108.  
  109.                      if($twinkle$msg->twinkle(); 
  110.  
  111.                      if($highLight$msg->highLight(); 
  112.  
  113.                      if($underLine$msg->underLine(); 
  114.  
  115.                  } 
  116.  
  117.              } 
  118.  
  119.              $this->write("\n"); 
  120.  
  121.  
  122.  
  123.          } 
  124.  
  125.  
  126.  
  127.          $this->dump(); 
  128.  
  129.      } 
  130.  
  131.      public function dump(){ 
  132.  
  133.          foreach$this->msgList as $msg){ 
  134.  
  135.              echo $msg->toString(); 
  136.  
  137.          } 
  138.  
  139.          $this->lastCountLine = $this->getLine(); 
  140.  
  141.          $this->msgList=[]; 
  142.  
  143.      } 
  144.  
  145.      public function cursorMove( int $x  , int $y  ) { 
  146.  
  147.  
  148.  
  149.          $this->write( $this->cursor->setOffset( $x,$y)); 
  150.  
  151.      } 
  152.  
  153.      public function getCountLine(){ 
  154.  
  155.          return $this->lastCountLine; 
  156.  
  157.      } 
  158.  
  159.      private function getLine(){ 
  160.  
  161.          if(!sizeof($this->msgList)) return 0; 
  162.  
  163.          else
  164.  
  165.              $line=0; 
  166.  
  167.              foreach(  $this->msgList as $msg ){ 
  168.  
  169.                  for($i=0;$i<mb_strlen($msg->msg);$i++){ 
  170.  
  171.                      if(mb_substr($msg->msg ,$i,1) == PHP_EOL) $line++; 
  172.  
  173.                  } 
  174.  
  175.              } 
  176.  
  177.  
  178.  
  179.              return $line
  180.  
  181.          } 
  182.  
  183.      } 
  184.  
  185.  
  186.  
  187.  } 

实例

直接输出带效果的文字

  1. // 实例化console类$c = new Console\Console();// 向console类里添加文本$msg = $c->write('this is a test msg.'.PHP_EOL);// 文本设置效果$msg->color('red')->bg('darkGreen')->highLight()->underLine();// 再次添加一个文本$msg2 = $c->write('this is another  msg.'.PHP_EOL);// 文本设置效果$msg2->color('yellow')->bg('purple')->twinkle()->underLine();// 输出文本$c->dump(); 

截图:

学习PHP-cli 模式在终端输出彩色标记文字以及动态内容

通过table标签标记输出文本

  1. /* 
  2.  
  3. table标记注意事项 
  4.  
  5. 1. 标签有且有table、tr、td,且表桥闭合 
  6.  
  7. 2. table、tr、td标签属性可设置color、bg、twinkle(等文字效果)、width、align。目前只实现了这些 
  8.  
  9. 3. 数据的动态展示原理是通过计算table的行数并移动光标达到的,并不是很严谨,效果也一般 
  10.  
  11. */ 
  12.  
  13.  // 用于随机字符 
  14.  
  15. $zmstr='abcdefghijklmnopqrstuvwxyz'
  16.  
  17. while(true){ 
  18.  
  19.     $html=' 
  20.  
  21.         <table align="right"
  22.  
  23.         <tr color="red"
  24.  
  25.             <td width=20 >英文</td> 
  26.  
  27.             <td width=30>数字</td> 
  28.  
  29.             <td width=30>中文</td> 
  30.  
  31.         </tr> 
  32.  
  33.         <tr> 
  34.  
  35.         </tr> 
  36.  
  37.     '; 
  38.  
  39.     for($i=0;$i<5;$i++){ 
  40.  
  41.         $num = rand(10,99); 
  42.  
  43.         $color=''
  44.  
  45.         if($num>80){ 
  46.  
  47.             $color='red'
  48.  
  49.         }else if($num>50){ 
  50.  
  51.             $color='green'
  52.  
  53.         }else if($num>30){ 
  54.  
  55.             $color='purple'
  56.  
  57.         } 
  58.  
  59.         $html.='<tr> 
  60.  
  61.                     <td width=20>'.$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].'</td> 
  62.  
  63.                     <td width=30 color="'.$color.'">'.$num.'</td> 
  64.  
  65.                     <td width=30 >测试</td> 
  66.  
  67.                 </tr>'; 
  68.  
  69.     } 
  70.  
  71.     $html.='</table>'
  72.  
  73.     // 移动光标 
  74.  
  75.     $c->cursorMove(-1000,-($c->getCountLine())); 
  76.  
  77.     // 通过table标签实例Table类 
  78.  
  79.     $t = new Table($html); 
  80.  
  81.     // 输出解析后的table标签 
  82.  
  83.     $c->table($t->table); 
  84.  
  85.     sleep(2); 
  86.  

截图:

学习PHP-cli 模式在终端输出彩色标记文字以及动态内容

Tags: PHP-cli模式

分享到: