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

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

时间2024-02-02 06:56:03发布访客分类PHP浏览970
导读:收集整理的这篇文章主要介绍了学习PHP-cli 模式在终端输出彩色标记文字以及动态内容,觉得挺不错的,现在分享给大家,也给大家做个参考。...
收集整理的这篇文章主要介绍了学习PHP-cli 模式在终端输出彩色标记文字以及动态内容,觉得挺不错的,现在分享给大家,也给大家做个参考。

文字的各种效果标记写法

  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:白色
  2. 标记闭合

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

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

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

光标的移动与设置

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

简单的实现

  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;
             }
         }
     }
        
  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->
        x0)$dx = 'D';
                 else $dx = 'C';
                 if($this->
        y0)$dy = 'A';
                 else $dy = 'B';
                 $absx = abs($this->
        x);
                 $absy = abs($this->
        y);
             return "\033[{
    $absx}
    {
    $dx}
    \033[{
    $absy}
    {
    $dy}
        ";
         }
     }
        
  3. table类,通便htML的table标记语言,输出table

    namespace Console;
    class Table{
             public $table=[];
             private $getV;
             private $currentTag='table';
             private $props = [         'color','bg','twinkle','highLight','underLine','colspan','rowspan','width','border','align'     ];
         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('标签有误,必须包含table tr  td标签且标签闭合');
             }
                 $this->
        table['html'] = $this->
        html;
                 $this->
        getPrototyPE('table',$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['tr'] = $trList[0];
                         foreach($this->
        table['tr'] as $k=>
    $tr){
                             $this->
        table['tr'][$k] = [];
                             preg_match_all("/td(\s+.*?)?>
        (.*?)\/td>
        /is",$tr,$tdList);
                             $this->
        table['tr'][$k]['td'] = $tdList[0];
                             $this->
        table['tr'][$k]['html'] =$tr;
                             $this->
        getPrototype('tr',$this->
        table['tr'][$k]);
                             foreach ($this->
        table['tr'][$k]['td'] as $kk=>
    $td){
                                 $this->
        table['tr'][$k]['td'][$kk] = [                             'html'=>
        $td,                             'content'=>
        $tdList[2][$kk]                         ];
                                 $this->
        getPrototype('td',$this->
        table['tr'][$k]['td'][$kk]);
                         }
                     }
                 }
    else{
                         die('Tr 不存在');
                 }
             }
    else{
                     die('Table 不存在');
             }
         }
             private function getPrototype(string $tag,&
    $v){
             preg_match("/{
    $tag}
        (\s.*?)?>
    (.*?)\/{
    $tag}
        >
        /is",$v['html'],$arr);
             if(strlen($arr[1])){
                     $arr2 = explode(" ", trim(preg_replace("/( +)/is"," ",$arr[1])));
                 foreach ($arr2 as $arr3){
                         $arr4 = explode('=',str_replace([' ',"\"","\'"],'',$arr3));
                         if(in_array($arr4[0],$this->
    props)){
                             $v[$arr4[0]] = $arr4[1];
                     }
                 }
             }
         }
     }
        
  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('//u',$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['tr'] as $tr){
                 foreach($tr['td'] as $td){
                     if($td['content']){
                             $len = self::getStrlen($td['content']);
         // 显示问题矫正                     $tdlen = $td['width'] ?? max(15,$len);
                             $tdlen = max($tdlen,$len);
                             $align = $td['align'] ??$tr['align']??$table['align']?? false;
                             if( $tdlen>
    $len ){
                             if( $align=='left'){
                                     $td['content'] =  $td['content'].str_repeat(' ',$tdlen-$len);
                             }
    else if($align=='right'){
                                     $td['content'] = str_repeat(' ',$tdlen-$len) . $td['content'];
                             }
    else{
                                     $td['content'] = str_repeat(' ',floor(($tdlen-$len)/2)) . $td['content'] . str_repeat(' ',ceil(($tdlen-$len)/2));
                             }
                         }
                             $msg = $this->
        write($td['content']);
                             $color = $td['color']  ??   $tr['color'] ??$table['color']??false;
                             $twinkle = $td['twinkle']  ??   $tr['twinkle'] ??$table['twinkle']??false;
                             $bg  = $td['bg ']  ??   $tr['bg '] ??$table['bg ']??false;
                             $highLight = $td['highLight']  ??   $tr['highLight'] ??$table['highLight']??false;
                             $underLine = $td['underLine']  ??   $tr['underLine'] ??$table['underLine']??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;
        $imb_strlen($msg->
        msg);
    $i++){
                             if(mb_substr($msg->
        msg ,$i,1) == PHP_EOL) $line++;
                     }
                 }
                     return $line;
             }
         }
     }
        

实例

  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();
        
    截图:
  2. 通过table标签标记输出文本
      /* table标记注意事项 1. 标签有且有table、tr、td,且表桥闭合 2. table、tr、td标签属性可设置color、bg、twinkle(等文字效果)、width、align。目前只实现了这些 3. 数据的动态展示原理是通过计算table的行数并移动光标达到的,并不是很严谨,效果也一般 */  // 用于随机字符 $zmstr='abcdefghijklmnopqrstuvwxyz';
     while(true){
             $html='         table align="right">
                 tr color="red">
                     td width=20 >
        英文/td>
                     td width=30>
        数字/td>
                     td width=30>
        中文/td>
                 /tr>
                 tr>
                 /tr>
             ';
             for($i=0;
        $i5;
    $i++){
                 $num = rand(10,99);
                 $color='';
                 if($num>
    80){
                     $color='red';
             }
        else if($num>
    50){
                     $color='green';
             }
        else if($num>
    30){
                     $color='purple';
             }
                 $html.='tr>
                             td width=20>
        '.$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].$zmstr[rand(0,25)].'/td>
                             td width=30 color="'.$color.'">
        '.$num.'/td>
                             td width=30 >
        测试/td>
                         /tr>
        ';
         }
             $html.='/table>
        ';
             // 移动光标     $c->
        cursorMove(-1000,-($c->
        getCountLine()));
             // 通过table标签实例Table类     $t = new Table($html);
             // 输出解析后的table标签     $c->
        table($t->
        table);
             sleep(2);
     }
        
    截图:

相关学习推荐:@R_777_1386@从入门到精通

以上就是学习PHP-cli 模式在终端输出彩色标记文字以及动态内容的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 学习PHP-cli 模式在终端输出彩色标记文字以及动态内容
本文地址: https://pptw.com/jishu/596508.html
一起看看PHP设计模式之适配器模式 PHP如何结合MySQL进行千万级数据处理

游客 回复需填写必要信息