Backend Development
PHP Tutorial
Learn PHP-cli mode to output colored markup text and dynamic content in the terminalLearn PHP-cli mode to output colored markup text and dynamic content in the terminal

文字的各种效果标记写法
-
字体颜色与背景色
\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->x<0)$dx = 'D'; else $dx = 'C'; if($this->y<0)$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;$i<mb_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;$i<5;$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); }截图:
相关学习推荐:PHP编程从入门到精通
The above is the detailed content of Learn PHP-cli mode to output colored markup text and dynamic content in the terminal. For more information, please follow other related articles on the PHP Chinese website!
Laravel routing parameter delivery and controller method definition: Avoiding common errors and best practicesJul 23, 2025 pm 07:27 PMThis tutorial details the correct method of parameter passing in Laravel routing, and corrects common errors in writing parameter placeholders into controller method names. The article provides examples of standardized routing definitions and controller methods, and emphasizes that deletion operations should prioritize the use of HTTPDELETE methods to enhance routing semantics and maintainability.
Guide to matching Laravel routing parameter passing and controller methodJul 23, 2025 pm 07:24 PMThis article aims to resolve common errors in the Laravel framework where routing parameter passing matches controller methods. We will explain in detail why writing parameters directly to the controller method name in the routing definition will result in an error of "the method does not exist", and provide the correct routing definition syntax to ensure that the controller can correctly receive and process routing parameters. In addition, the article will explore best practices for using HTTPDELETE methods in deletion operations.
How to use PHP to develop a Q&A community platform Detailed explanation of PHP interactive community monetization modelJul 23, 2025 pm 07:21 PM1. The first choice for the Laravel MySQL Vue/React combination in the PHP development question and answer community is the first choice for Laravel MySQL Vue/React combination, due to its maturity in the ecosystem and high development efficiency; 2. High performance requires dependence on cache (Redis), database optimization, CDN and asynchronous queues; 3. Security must be done with input filtering, CSRF protection, HTTPS, password encryption and permission control; 4. Money optional advertising, member subscription, rewards, commissions, knowledge payment and other models, the core is to match community tone and user needs.
Efficiently use JSON data to implement cascading drop-down menus in Laravel Blade templatesJul 23, 2025 pm 07:18 PMThis article details how to load a local JSON file in a Laravel application and pass its data to a Blade template. By processing JSON parsing by the controller, the view layer uses Blade's @foreach instruction to traverse the data, thereby realizing dynamically generating drop-down menus. In particular, the article also explores in-depth how to combine JavaScript to implement multi-level linkage drop-down menu functions to provide users with dynamic content display based on selection, and provides practical code examples and precautions for implementing such interactions.
Deep analysis of matching Laravel routing parameter transfer and controller methodJul 23, 2025 pm 07:15 PMThis article deeply explores the correct transmission of routing parameters and the matching mechanism of controller methods in the Laravel framework. In response to the common "method does not exist" error caused by writing routing parameters directly to the controller method name, the article elaborates on the correct way to define routing, that is, declare parameters in the URI and receive them as independent parameters in the controller method. At the same time, the article also provides code examples and suggestions on best practices for HTTP methods, aiming to help developers build more robust and RESTful Laravel applications.
PHP integrated AI intelligent image processing PHP image beautification and automatic editingJul 23, 2025 pm 07:12 PMPHP integrated AI image processing requires the help of a third-party API or local model, which cannot be directly implemented; 2. Use ready-made services such as Google CloudVision API to quickly realize facial recognition, object detection and other functions. The advantages are fast development and strong functions. The disadvantages are that they need to pay, rely on the network and have data security risks; 3. Deploy local AI models through PHP image library such as Imagick or GD combined with TensorFlowLite or ONNXRuntime. It can be customized, the data is safer, and the cost is low, but the development is difficult and requires AI knowledge; 4. Mixed solutions can combine the advantages of API and local model, such as using API for detection and beautification of local models; 5. Selecting AI image processing API should be comprehensive
Twilio Voice Call Maintenance and Recovery: Meeting Functions and Independent Call Leg Management PracticeJul 23, 2025 pm 07:09 PMThis article discusses in-depth two main strategies for realizing voice call holding (Hold) and recovery (Unhold) on the Twilio platform. First, we introduce the detailed introduction to leveraging the Twilio Conference feature to easily manage call retention by updating the Participant resources, and provide corresponding code examples. Second, for scenarios where more detailed control of independent call legs (CallLeg) is required, how to combine TwiML instructions (such as and/) to handle call reconnection, while highlighting the complexity of this approach. The article aims to provide professional and practical guidance to help developers choose the most suitable implementation solution according to specific needs.
Laravel routing parameter passing: correctly define the controller method and routing bindingJul 23, 2025 pm 07:06 PMThis article discusses the correct posture of parameter transfer of controller method in Laravel routing in depth. In response to common errors caused by writing routing parameters directly to the controller method name, the correct routing definition syntax is explained in detail, and the mechanism of Laravel automatic parameter binding is emphasized. At the same time, the article recommends using HTTPDELETE method that is more in line with RESTful specifications to handle deletion operations to improve the maintainability and semantics of the application.


Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

SublimeText3 Linux new version
SublimeText3 Linux latest version

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Atom editor mac version download
The most popular open source editor







