Copy & Paste Engineer

【PHP】CLIで簡単にテキストに色を付ける方法

【PHP】CLIで簡単にテキストに色を付ける方法

PHP で CLI 実行時に少々色を付けたいなと思って作ってみました。 ANSIエスケープコードを使用することでターミナル上で色が付きます。

サンプルコード

サンプルコードです。

<?php

class CliColor
{
    public const BLACK = 'black';
    public const RED = 'red';
    public const GREEN = 'green';
    public const YELLOW = 'yellow';
    public const BLUE = 'blue';
    public const MAGENTA = 'magenta';
    public const CYAN = 'cyan';
    public const WHITE = 'white';
    public const BRIGHT_BLACK = 'bright_black';
    public const BRIGHT_RED = 'bright_red';
    public const BRIGHT_GREEN = 'bright_green';
    public const BRIGHT_YELLOW = 'bright_yellow';
    public const BRIGHT_BLUE = 'bright_blue';
    public const BRIGHT_MAGENTA = 'bright_magenta';
    public const BRIGHT_CYAN = 'bright_cyan';
    public const BRIGHT_WHITE = 'bright_white';
    public const BG_BLACK = 'bg_black';
    public const BG_RED = 'bg_red';
    public const BG_GREEN = 'bg_green';
    public const BG_YELLOW = 'bg_yellow';
    public const BG_BLUE = 'bg_blue';
    public const BG_MAGENTA = 'bg_magenta';
    public const BG_CYAN = 'bg_cyan';
    public const BG_WHITE = 'bg_white';
    public const BG_BRIGHT_BLACK = 'bg_bright_black';
    public const BG_BRIGHT_RED = 'bg_bright_red';
    public const BG_BRIGHT_GREEN = 'bg_bright_green';
    public const BG_BRIGHT_YELLOW = 'bg_bright_yellow';
    public const BG_BRIGHT_BLUE = 'bg_bright_blue';
    public const BG_BRIGHT_MAGENTA = 'bg_bright_magenta';
    public const BG_BRIGHT_CYAN = 'bg_bright_cyan';
    public const BG_BRIGHT_WHITE = 'bg_bright_white';
    public const RESET = 'reset';

    /**
     * 色定義
     */
    private const COLORS = [
        self::BLACK => "\033[0;30m",
        self::RED => "\033[0;31m",
        self::GREEN => "\033[0;32m",
        self::YELLOW => "\033[0;33m",
        self::BLUE => "\033[0;34m",
        self::MAGENTA => "\033[0;35m",
        self::CYAN => "\033[0;36m",
        self::WHITE => "\033[0;37m",
        self::BRIGHT_BLACK => "\033[1;30m",
        self::BRIGHT_RED => "\033[1;31m",
        self::BRIGHT_GREEN => "\033[1;32m",
        self::BRIGHT_YELLOW => "\033[1;33m",
        self::BRIGHT_BLUE => "\033[1;34m",
        self::BRIGHT_MAGENTA => "\033[1;35m",
        self::BRIGHT_CYAN => "\033[1;36m",
        self::BRIGHT_WHITE => "\033[1;37m",
        self::BG_BLACK => "\033[40m",
        self::BG_RED => "\033[41m",
        self::BG_GREEN => "\033[42m",
        self::BG_YELLOW => "\033[43m",
        self::BG_BLUE => "\033[44m",
        self::BG_MAGENTA => "\033[45m",
        self::BG_CYAN => "\033[46m",
        self::BG_WHITE => "\033[47m",
        self::BG_BRIGHT_BLACK => "\033[100m",
        self::BG_BRIGHT_RED => "\033[101m",
        self::BG_BRIGHT_GREEN => "\033[102m",
        self::BG_BRIGHT_YELLOW => "\033[103m",
        self::BG_BRIGHT_BLUE => "\033[104m",
        self::BG_BRIGHT_MAGENTA => "\033[105m",
        self::BG_BRIGHT_CYAN => "\033[106m",
        self::BG_BRIGHT_WHITE => "\033[107m",
        self::RESET => "\033[0m",
    ];

    /**
     * 指定された色でテキストを装飾した文字列を返します。
     *
     * @param string|null $text 色を付けるテキスト。
     * @param string|array|null $colors テキストに適用する色。単一の色または複数の色の配列。
     * @return string 色付きテキストの文字列。
     */
    public static function text(?string $text, string | array | null $colors = null): string
    {
        if (!is_array($colors)) {
            $colors = [$colors];
        }

        $coloredText = "";
        foreach ($colors as $color) {
            if (array_key_exists($color, self::COLORS)) {
                $coloredText .= self::COLORS[$color];
            }
        }

        return $coloredText . $text . self::COLORS[self::RESET];
    }
}

実行

試しに実行してみます。

# 通常出力
echo CliColor::text("Hello, World!") . PHP_EOL;
# 赤い文字
echo CliColor::text("Hello, World!", CliColor::RED) . PHP_EOL;
# 白文字、赤背景
echo CliColor::text("Hello, World!", [CliColor::WHITE, CliColor::BG_RED]) . PHP_EOL;

下のように出力されます。 php-cli-text-color

参考