【技巧】讓你的PHP命令行輸出豐富多彩

大家有沒有注意到寸爆,在我們使用 composer 進行依賴管理的時候礁鲁,它在命令行中的輸出竟然是彩色的,而我們自己寫的程序使用 echo 進行輸出的時候赁豆,都是默認的黑底白字(依賴于主題)仅醇,逼格一點都不高!

探究開始

為了探究命令行帶顏色輸出魔种,我查看了安裝 composer 時從官方下載的 composer-setup.php 析二,其中的字符輸出函數(shù)如下:

/**
 * colorize output
 */
function out($text, $color = null, $newLine = true)
{
    $styles = array(
        'success' => "\033[0;32m%s\033[0m",
        'error' => "\033[31;31m%s\033[0m",
        'info' => "\033[33;33m%s\033[0m"
    );

    $format = '%s';

    if (isset($styles[$color]) && USE_ANSI) {
        $format = $styles[$color];
    }

    if ($newLine) {
        $format .= PHP_EOL;
    }

    printf($format, $text);
}

可以看到,這個函數(shù)中定義了三種類型的色彩輸出节预,而且都是用形如 \033[Xm 的特殊字符串將其包裝之后進行的輸出叶摄,所以,這個形式的特殊字符串究竟是個什么神奇東西安拟?

ANSI轉(zhuǎn)義序列

經(jīng)過查詢資料蛤吓,發(fā)現(xiàn)上一節(jié)中所述的神奇字符串是 ANSI轉(zhuǎn)義序列[1] ,通過它可以控制文字在終端上的樣式去扣,如加粗柱衔、斜體、顏色等愉棱。
ANSI轉(zhuǎn)義序列的解析在終端進行唆铐,不同的終端的對其的支持程度也不盡相同,本文采用的終端是 xShell 奔滑,已經(jīng)可以支持大部分的轉(zhuǎn)移序列艾岂。

序列寫法

ANSI轉(zhuǎn)義序列以 ESC轉(zhuǎn)義字符(ASCII碼為27) 和 字符[ 開始,以字符 m 結(jié)束朋其,上一節(jié)代碼中的 ESC轉(zhuǎn)移字符串 采用了八進制的寫法王浴,在實際使用中我們也可以用 \e 這樣的轉(zhuǎn)義寫法脆炎。

牛刀小試

在終端執(zhí)行如下命令:

echo -e "\e[38;5;1m紅色\e[0m"

可以看到終端中將出現(xiàn)如下輸出:

紅色文字輸出.png

文字變成紅色的了!
那么上述指令時怎么控制文字的顏色的呢氓辣?
緊跟在 [ 之后數(shù)字 38 告訴終端轉(zhuǎn)義序列要控制文字的前景色了秒裕,后續(xù)的 5 表示采用 256色,1 表示使用紅色钞啸,隨即轉(zhuǎn)義序列以 m 結(jié)束几蜻,進入一般字符串部分;
在字符串的最后体斩,又開始了一個轉(zhuǎn)義序列梭稚,數(shù)字 0 表示重置所有的字體樣式處理,以防止本條指令執(zhí)行之后還會影響其他指令的顏色輸出絮吵;

控制參數(shù)

下面是從 維基百科ANSI轉(zhuǎn)義序列詞條頁 所摘錄的轉(zhuǎn)義序列控制參數(shù)表:

代碼 作用 備注
0 重置/正常 關(guān)閉所有屬性弧烤。
1 粗體或增加強度
2 弱化(降低強度) 未廣泛支持。
3 斜體 未廣泛支持蹬敲。有時視為反相顯示暇昂。
4 下劃線
5 緩慢閃爍 低于每分鐘150次。
6 快速閃爍 MS-DOS ANSI.SYS粱栖;每分鐘150以上话浇;未廣泛支持。
7 反顯 前景色與背景色交換闹究。
8 隱藏 未廣泛支持幔崖。
9 劃除 字符清晰,但標記為刪除渣淤。未廣泛支持赏寇。
10 主要(默認)字體
11–19 替代字體 選擇替代字體 n - 1
20 尖角體 幾乎無支持。
21 關(guān)閉粗體或雙下劃線 關(guān)閉粗體未廣泛支持价认;雙下劃線幾乎無支持嗅定。
22 正常顏色或強度 不強不弱。
23 非斜體用踩、非尖角體
24 關(guān)閉下劃線 去掉單雙下劃線渠退。
25 關(guān)閉閃爍
27 關(guān)閉反顯
28 關(guān)閉隱藏
29 關(guān)閉劃除
30–37 設(shè)置前景色 參見下面的顏色表。
38 設(shè)置前景色 下一個參數(shù)是5;n2;r;g;b脐彩,見下碎乃。
39 默認前景色 由具體實現(xiàn)定義(按照標準)。
40–47 設(shè)置背景色 參見下面的顏色表惠奸。
48 設(shè)置背景色 下一個參數(shù)是5;n2;r;g;b梅誓,見下。
49 默認背景色 由具體實現(xiàn)定義(按照標準)。
51 Framed
52 Encircled
53 上劃線
54 Not framed or encircled
55 關(guān)閉上劃線
60 表意文字下劃線或右邊線 幾乎無支持梗掰。
61 表意文字雙下劃線或雙右邊線 幾乎無支持嵌言。
62 表意文字上劃線或左邊線 幾乎無支持。
63 表意文字雙上劃線或雙左邊線 幾乎無支持及穗。
64 表意文字著重標志 幾乎無支持摧茴。
65 表意文字屬性關(guān)閉 重置6064的所有效果。
90–97 設(shè)置明亮的前景色 aixterm(非標準)拥坛。
100–107 設(shè)置明亮的背景色 aixterm(非標準)蓬蝶。

來點騷操作

ANSI轉(zhuǎn)義序列對于文字樣式的控制效果時可以疊加的,使用示例如下:

echo -e "\e[38;5;255;48;5;1;1;4;9;5m紅底白字加粗閃爍\e[0m\e[38;5;4;1m藍色加粗\e[0m"

輸出如下:

命令輸出結(jié)果截圖.gif

注意:上述樣例中藍色加粗部分在定義樣式之前使用字符串\e[0m 清除了之前所配置的樣式猜惋,如果不執(zhí)行這一步,藍色加粗部分字體還會攜帶紅色背景和閃爍效果培愁。

在PHP中運用

可以觀察到上我們在上一節(jié)中我們所使用的 echo 指令都帶上了 -e 參數(shù)來進行特殊字符處理著摔,那么PHP中要怎么使用ANSI轉(zhuǎn)義序列呢?
經(jīng)過本人的親測定续,PHP中的語法接口 echo 是會進行特殊字符處理的谍咆,所以上述樣例在PHP代碼中可以這么寫:

<?php
echo "\e[38;5;255;48;5;1;1;4;9;5m紅底白字加粗閃爍\e[0m\e[38;5;4;1m藍色加粗\e[0m", PHP_EOL;

腳本的運行結(jié)果同上面截圖中的一致。

工具化

每次調(diào)整文字的樣式都要寫那么一串轉(zhuǎn)義序列太麻煩了私股,而且可讀性也很差摹察。
為了更方便地在PHP程序中輸出樣式豐富的字符串到終端,我們需要實現(xiàn)一個工具類倡鲸。


  1. ANSI轉(zhuǎn)義序列 - 維基百科供嚎,自由的百科全書 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峭状,隨后出現(xiàn)的幾起案子克滴,更是在濱河造成了極大的恐慌,老刑警劉巖优床,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劝赔,死亡現(xiàn)場離奇詭異,居然都是意外死亡胆敞,警方通過查閱死者的電腦和手機着帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移层,“玉大人仍翰,你說我怎么就攤上這事∮母郑” “怎么了歉备?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匪燕。 經(jīng)常有香客問我蕾羊,道長喧笔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任龟再,我火速辦了婚禮书闸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘利凑。我一直安慰自己浆劲,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布哀澈。 她就那樣靜靜地躺著牌借,像睡著了一般。 火紅的嫁衣襯著肌膚如雪割按。 梳的紋絲不亂的頭發(fā)上膨报,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音适荣,去河邊找鬼现柠。 笑死,一個胖子當著我的面吹牛弛矛,可吹牛的內(nèi)容都是我干的够吩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丈氓,長吁一口氣:“原來是場噩夢啊……” “哼周循!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扒寄,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鱼鼓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后该编,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迄本,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年课竣,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘉赎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡于樟,死狀恐怖公条,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迂曲,我是刑警寧澤靶橱,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響关霸,放射性物質(zhì)發(fā)生泄漏传黄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一队寇、第九天 我趴在偏房一處隱蔽的房頂上張望膘掰。 院中可真熱鬧,春花似錦佳遣、人聲如沸识埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窒舟。三九已至,卻和暖如春诵盼,著一層夾襖步出監(jiān)牢的瞬間辜纲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工拦耐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人见剩。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓杀糯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苍苞。 傳聞我的和親對象是個殘疾皇子固翰,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1羹呵、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,109評論 1 19
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,407評論 0 5
  • 一骂际、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,750評論 0 10
  • Awesome PHP 一個PHP資源列表,內(nèi)容包括:庫冈欢、框架歉铝、模板、安全凑耻、代碼分析太示、日志、第三方庫香浩、配置工具类缤、W...
    guanguans閱讀 5,765評論 0 47
  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 3,960評論 1 66