学习PHP-cli 模式在终端输出彩色标记文字以及动态内容
导读:收集整理的这篇文章主要介绍了学习PHP-cli 模式在终端输出彩色标记文字以及动态内容,觉得挺不错的,现在分享给大家,也给大家做个参考。...
收集整理的这篇文章主要介绍了学习PHP-cli 模式在终端输出彩色标记文字以及动态内容,觉得挺不错的,现在分享给大家,也给大家做个参考。
文字的各种效果标记写法
字体颜色与背景色
\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 显示光标
简单的实现
文字效果操作类
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; } } }光标操作类
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} "; } }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]; } } } } }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; } } }
实例
- 直接输出带效果的文字
// 实例化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();截图: - 通过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
