Lernen Sie den PHP-CLI-Modus zur Ausgabe von farbigem Markup-Text und dynamischen Inhalten im Terminal

coldplay.xixi
Freigeben: 2023-04-09 06:20:01
nach vorne
2393 Leute haben es durchsucht

Lernen Sie den PHP-CLI-Modus zur Ausgabe von farbigem Markup-Text und dynamischen Inhalten im Terminal

文字的各种效果标记写法

  1. 字体颜色与背景色

     \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:白色
    Nach dem Login kopieren
  2. 标记闭合

      所有效果在文本结尾处要加上闭合的标记:\033[0m;
    Nach dem Login kopieren
  3. 文字高亮等其他效果

     \033[1m 文字高亮
     \033[4m 下划线
     \033[5m 闪烁
     \033[7m 反显
     \033[8m 消隐
    Nach dem Login kopieren
  4. 多种效果组合使用

      多种效果组合使用时用英文分号隔开,例如蓝底红字下划线加闪烁
      echo "\033[44;31;4m  this is a test msg  \033[0m".PHP_EOL;
    Nach dem Login kopieren

光标的移动与设置

  1. 移动
     \033[nA 光标上移n行   
     \033[nB 光标下移n行  
     \033[nC 光标右移n行  
     \033[nD 光标左移n行
    Nach dem Login kopieren
  2. 设置
     \033[y;xH设置光标位置  
     \033[2J 清屏  
     \033[K 清除从光标到行尾的内容  
     \033[s 保存光标位置   
     \033[u 恢复光标位置  
     \033[?25l 隐藏光标  
     \033[?25h 显示光标
    Nach dem Login kopieren

简单的实现

  1. 文字效果操作类

    namespace Console;class Style{
         private $colors = [
             "black"=>30,
             "red"=>31,
             "green"=>32,
             "yellow"=>33,
             "blue"=>34,
             "purple"=>35,
             "darkGreen"=>36,
             "white"=>37,
         ];
         private $backgrounds = [
             "black"=>40,
             "darkRed"=>41,
             "green"=>42,
             "yellow"=>43,
             "blue"=>44,
             "purple"=>45,
             "darkGreen"=>46,
             "white"=>47,
         ];
    
         public $msg;
         public $style = [];
         public function __construct($msg){
             $this->msg = $msg;
         }
         // 设置文本颜色
         public function color( string $c ){
             if( isset( $this->colors[$c]) ) $this->style[] = $this->colors[$c];
             return $this;
         }
         // 设置背景色
         public function bg( string $c ){
             if(isset($this->backgrounds[$c]) ) $this->style[] = $this->backgrounds[$c];
             return $this;
         }
         // 高亮
         public function highLight(){
             $this->style[] = 1;
             return $this;
         }
         // 下划线
         public function underLine(){
             $this->style[] = 4;
             return $this;
         }
         // 闪烁
         public function twinkle(){
             $this->style[] = 5;
             return $this;
         }
         // 反显
         public function rshow(){
             $this->style[] = 7;
             return $this;
         }
         //  消隐
         public function hide(){
             $this->style[] = 8;
             return $this;
         }
    
         public function toString(){
             $this->style = array_unique($this->style);
             if($this->msg){
                 if(sizeof($this->style)  ){
                     return "\033[".implode(';',$this->style)."m"  . $this->msg . "\033[0m";
                 }else{
                     return $this->msg. "\033[0m";
                 }
             }else{
                 return false;
             }
         }
     }
    Nach dem Login kopieren
  2. 光标操作类

    namespace Console;
    
     // 光标的信息以及操作
     class Cursor{
         // 光标设置 \033[y;xH
         private $x=0;
         private $y=0;
         // 获取光标X轴位置
         public function offsetX(){
             return $this->x;
         }
         // 获取光标Y轴位置
         public function offsetY(){
             return $this->y;
         }
    
         // 获取光标坐标
         public function offset(){
             return [
                 'x'=>$this->x,
                 'y'=>$this->y,
             ];
         }
         public function setX( int $x ){
             $this->x = $x;
         }
    
         public function setY( int $y ){
             $this->y = $y;
         }
    
         public function setOffset( int $x , int $y ){
             $this->x = $x;
             $this->y = $y;
             return $this->toString();
         }
         // 清屏
         public function clear(){
             return "\033[2J";
         }
    
         public function show(){
             return "\33[?25h";
         }
         public function hide(){
             return "\33[?25l";
         }
    
         public function toString(){
             if($this->x<0)$dx = &#39;D&#39;;
             else $dx = &#39;C&#39;;
             if($this->y<0)$dy = &#39;A&#39;;
             else $dy = &#39;B&#39;;
             $absx = abs($this->x);
             $absy = abs($this->y);
             return "\033[{$absx}{$dx}\033[{$absy}{$dy}";
         }
     }
    Nach dem Login kopieren
  3. table类,通便html的table标记语言,输出table

    namespace Console;class Table{
         public $table=[];
         private $getV;
         private $currentTag=&#39;table&#39;;
         private $props = [
             &#39;color&#39;,&#39;bg&#39;,&#39;twinkle&#39;,&#39;highLight&#39;,&#39;underLine&#39;,&#39;colspan&#39;,&#39;rowspan&#39;,&#39;width&#39;,&#39;border&#39;,&#39;align&#39;
         ];
         public function __construct( string $html){
             // 解析字符串最好
             $this->html=$html;
             $this->parse();
         }
         // 解析字符串 将table的每个tr td以及属性都解析出来 
         private function parse(){
             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) ){
                 die(&#39;标签有误,必须包含table tr  td标签且标签闭合&#39;);
             }
    
             $this->table[&#39;html&#39;] = $this->html;
             $this->getPrototype(&#39;table&#39;,$this->table);
             preg_match_all("/<table(\s+.*?)?>(.*?)<\/table>/is",$this->html,$innerTable);
             if( $innerTable[0][0] ){
                 preg_match_all("/<tr(\s+.*?)?>(.*?)<\/tr>/is",$this->html,$trList);
                 if( $trList[0] ){
                     $this->table[&#39;tr&#39;] = $trList[0];
                     foreach($this->table[&#39;tr&#39;] as $k=>$tr){
                         $this->table[&#39;tr&#39;][$k] = [];
                         preg_match_all("/<td(\s+.*?)?>(.*?)<\/td>/is",$tr,$tdList);
                         $this->table[&#39;tr&#39;][$k][&#39;td&#39;] = $tdList[0];
                         $this->table[&#39;tr&#39;][$k][&#39;html&#39;] =$tr;
                         $this->getPrototype(&#39;tr&#39;,$this->table[&#39;tr&#39;][$k]);
                         foreach ($this->table[&#39;tr&#39;][$k][&#39;td&#39;] as $kk=>$td){
                             $this->table[&#39;tr&#39;][$k][&#39;td&#39;][$kk] = [
                                 &#39;html&#39;=>$td,
                                 &#39;content&#39;=>$tdList[2][$kk]
                             ];
                             $this->getPrototype(&#39;td&#39;,$this->table[&#39;tr&#39;][$k][&#39;td&#39;][$kk]);
                         }
                     }
                 }else{
                     die(&#39;Tr 不存在&#39;);
                 }
             }else{
                 die(&#39;Table 不存在&#39;);
             }
         }
         private function getPrototype(string $tag,&$v){
             preg_match("/<{$tag}(\s.*?)?>(.*?)<\/{$tag}>/is",$v[&#39;html&#39;],$arr);
             if(strlen($arr[1])){
                 $arr2 = explode(" ", trim(preg_replace("/( +)/is"," ",$arr[1])));
                 foreach ($arr2 as $arr3){
                     $arr4 = explode(&#39;=&#39;,str_replace([&#39; &#39;,"\"","\&#39;"],&#39;&#39;,$arr3));
                     if(in_array($arr4[0],$this->props)){
                         $v[$arr4[0]] = $arr4[1];
                     }
                 }
             }
         }
     }
    Nach dem Login kopieren
  4. console类,输出自定义的文本或table格式文本

    namespace Console;class Console{
         public $cursor;
         private $msgList=[];
         private $lastCountLine=0;
         public function __construct(){
             $this->cursor= new Cursor();
         }
    
         private static function getStrlen($str){
             if(!$str) return 0;
             $l=0;
             $strArr = preg_split(&#39;//u&#39;,$str,-1, PREG_SPLIT_NO_EMPTY);
             if(is_array($strArr)){
                 foreach($strArr as $v){
                     if(preg_match("/^[\x{4e00}-\x{9fa5}]$/u", $v)) $l += 2;
                     else $l += 1;
                 }
             }
             return $l;
         }
    
         public function write($msg){
             $msgStyle = new Style($msg);
             $this->msgList[] =  $msgStyle;
             return  $msgStyle;
         }
    
         public function table(array $table){
             foreach($table[&#39;tr&#39;] as $tr){
    
                 foreach($tr[&#39;td&#39;] as $td){
                     if($td[&#39;content&#39;]){
                         $len = self::getStrlen($td[&#39;content&#39;]); // 显示问题矫正
                         $tdlen = $td[&#39;width&#39;] ?? max(15,$len);
                         $tdlen = max($tdlen,$len);
                         $align = $td[&#39;align&#39;] ??$tr[&#39;align&#39;]??$table[&#39;align&#39;]?? false;
                         if( $tdlen>$len ){
                             if( $align==&#39;left&#39;){
                                 $td[&#39;content&#39;] =  $td[&#39;content&#39;].str_repeat(&#39; &#39;,$tdlen-$len);
                             }else if($align==&#39;right&#39;){
                                 $td[&#39;content&#39;] = str_repeat(&#39; &#39;,$tdlen-$len) . $td[&#39;content&#39;];
                             }else{
                                 $td[&#39;content&#39;] = str_repeat(&#39; &#39;,floor(($tdlen-$len)/2)) . $td[&#39;content&#39;] . str_repeat(&#39; &#39;,ceil(($tdlen-$len)/2));
                             }
                         }
                         $msg = $this->write($td[&#39;content&#39;]);
                         $color = $td[&#39;color&#39;]  ??   $tr[&#39;color&#39;] ??$table[&#39;color&#39;]??false;
                         $twinkle = $td[&#39;twinkle&#39;]  ??   $tr[&#39;twinkle&#39;] ??$table[&#39;twinkle&#39;]??false;
                         $bg  = $td[&#39;bg &#39;]  ??   $tr[&#39;bg &#39;] ??$table[&#39;bg &#39;]??false;
                         $highLight = $td[&#39;highLight&#39;]  ??   $tr[&#39;highLight&#39;] ??$table[&#39;highLight&#39;]??false;
                         $underLine = $td[&#39;underLine&#39;]  ??   $tr[&#39;underLine&#39;] ??$table[&#39;underLine&#39;]??false;
    
                         if($color) $msg->color($color);
                         if($bg) $msg->bg($bg);
                         if($twinkle) $msg->twinkle();
                         if($highLight) $msg->highLight();
                         if($underLine) $msg->underLine();
                     }
                 }
                 $this->write("\n");
    
             }
    
             $this->dump();
         }
         public function dump(){
             foreach( $this->msgList as $msg){
                 echo $msg->toString();
             }
             $this->lastCountLine = $this->getLine();
             $this->msgList=[];
         }
         public function cursorMove( int $x  , int $y  ) {
    
             $this->write( $this->cursor->setOffset( $x,$y));
         }
         public function getCountLine(){
             return $this->lastCountLine;
         }
         private function getLine(){
             if(!sizeof($this->msgList)) return 0;
             else{
                 $line=0;
                 foreach(  $this->msgList as $msg ){
                     for($i=0;$i<mb_strlen($msg->msg);$i++){
                         if(mb_substr($msg->msg ,$i,1) == PHP_EOL) $line++;
                     }
                 }
    
                 return $line;
             }
         }
    
     }
    Nach dem Login kopieren

实例

  1. 直接输出带效果的文字
    // 实例化console类$c = new Console\Console();// 向console类里添加文本$msg = $c->write(&#39;this is a test msg.&#39;.PHP_EOL);// 文本设置效果$msg->color(&#39;red&#39;)->bg(&#39;darkGreen&#39;)->highLight()->underLine();// 再次添加一个文本$msg2 = $c->write(&#39;this is another  msg.&#39;.PHP_EOL);// 文本设置效果$msg2->color(&#39;yellow&#39;)->bg(&#39;purple&#39;)->twinkle()->underLine();// 输出文本$c->dump();
    Nach dem Login kopieren
    截图:
  2. 通过table标签标记输出文本
      /*
     table标记注意事项
     1. 标签有且有table、tr、td,且表桥闭合
     2. table、tr、td标签属性可设置color、bg、twinkle(等文字效果)、width、align。目前只实现了这些
     3. 数据的动态展示原理是通过计算table的行数并移动光标达到的,并不是很严谨,效果也一般
     */
      // 用于随机字符
     $zmstr=&#39;abcdefghijklmnopqrstuvwxyz&#39;;
     while(true){
         $html=&#39;
             <table align="right">
             <tr color="red">
                 <td width=20 >英文</td>
                 <td width=30>数字</td>
                 <td width=30>中文</td>
             </tr>
             <tr>
             </tr>
         &#39;;
         for($i=0;$i<5;$i++){
             $num = rand(10,99);
             $color=&#39;&#39;;
             if($num>80){
                 $color=&#39;red&#39;;
             }else if($num>50){
                 $color=&#39;green&#39;;
             }else if($num>30){
                 $color=&#39;purple&#39;;
             }
             $html.=&#39;<tr>
                         <td width=20>&#39;.$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].&#39;</td>
                         <td width=30 color="&#39;.$color.&#39;">&#39;.$num.&#39;</td>
                         <td width=30 >测试</td>
                     </tr>&#39;;
         }
         $html.=&#39;</table>&#39;;
         // 移动光标
         $c->cursorMove(-1000,-($c->getCountLine()));
         // 通过table标签实例Table类
         $t = new Table($html);
         // 输出解析后的table标签
         $c->table($t->table);
         sleep(2);
     }
    Nach dem Login kopieren
    截图:

相关学习推荐:PHP编程从入门到精通

Das obige ist der detaillierte Inhalt vonLernen Sie den PHP-CLI-Modus zur Ausgabe von farbigem Markup-Text und dynamischen Inhalten im Terminal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage