PHPでターミナルにカラー付きテキストを表示する方法を解説!ANSIエスケープコードの使い方

PHPを使用してターミナルでのテキスト出力に色やスタイルを追加する方法について説明します。通常、PHPはWeb開発で使用されることが多いですが、ターミナルベースのスクリプトやCLIツールの開発にも便利です。その際、標準のテキスト出力ではなく、視覚的にわかりやすいカラフルな表示を行いたい場合があります。本記事では、ANSIエスケープコードを活用してターミナル上でカラー付きテキストを表示する方法を学び、テキストの装飾や強調表示をする手法について詳しく解説します。

目次

ANSIエスケープコードとは


ANSIエスケープコードは、ターミナル上でのテキスト表示を制御するためのシーケンスです。これにより、文字の色を変えたり、背景色を設定したり、テキストに装飾(太字、下線など)を追加することができます。これらのコードは、特定のエスケープシーケンスを使ってターミナルに命令を送ることで動作します。

ANSIエスケープコードの基本構造


エスケープコードは通常、「\033[」で始まり、続く数値や記号でスタイルを指定します。例えば、\033[31mは文字色を赤に変更するためのコードです。

色とスタイルの概要


ANSIエスケープコードでは、30〜37が前景色、40〜47が背景色を指定します。加えて、太字(1)、下線(4)などの装飾も行えます。これらを組み合わせることで、さまざまなスタイルを表現できます。

PHPでのANSIエスケープコードの使い方


PHPでは、ANSIエスケープコードを文字列内に直接記述することでターミナル上に色付きテキストを表示できます。エスケープシーケンスを文字列内に埋め込み、特定のスタイルを適用する形式です。

基本的な使い方


PHPのecho関数を用いて、ANSIエスケープコードを含む文字列を出力することができます。例えば、赤い文字で「Hello, World!」を表示するには、次のように記述します。

echo "\033[31mHello, World!\033[0m\n";

この例では、\033[31mで文字色を赤に設定し、\033[0mで色の設定をリセットしています。リセットしないと、以降の出力もすべて赤くなってしまうため、必ずリセットコードを使うことが推奨されます。

エスケープコードの組み合わせ


複数のスタイルを組み合わせて適用することも可能です。例えば、太字の緑色で文字を表示する場合は次のように書きます。

echo "\033[1;32mBold and Green Text\033[0m\n";

ここで、\033[1;32mは「太字(1)と緑色(32)」を同時に設定するコードです。このようにセミコロンで区切って複数の設定を一度に適用できます。

カスタム関数の作成


繰り返し利用するエスケープコードは、関数化することで利便性が向上します。以下に、テキストに色を付けるカスタム関数の例を示します。

function colorText($text, $colorCode) {
    return "\033[" . $colorCode . "m" . $text . "\033[0m";
}

echo colorText("This is blue text", "34");

この関数を使うことで、指定した色コードで簡単にテキストを装飾できます。

色とスタイルの指定方法


ANSIエスケープコードを使用することで、PHPでターミナル上のテキストにさまざまな色やスタイルを適用できます。色は前景色(文字色)と背景色に分かれており、スタイルには太字や下線などがあります。

前景色と背景色の指定


ANSIエスケープコードで色を指定する場合、30〜37のコードが前景色(文字色)に、40〜47のコードが背景色に対応します。具体的な色の指定は以下のとおりです。

  • 前景色
  • 30 : 黒
  • 31 : 赤
  • 32 : 緑
  • 33 : 黄
  • 34 : 青
  • 35 : 紫
  • 36 : シアン
  • 37 : 白
  • 背景色
  • 40 : 黒
  • 41 : 赤
  • 42 : 緑
  • 43 : 黄
  • 44 : 青
  • 45 : 紫
  • 46 : シアン
  • 47 : 白

テキストスタイルの指定


ANSIエスケープコードでは、色だけでなくスタイルも指定できます。以下のようなコードを使って、テキストにさまざまな装飾を加えられます。

  • スタイルコード
  • 0 : すべてのスタイルをリセット
  • 1 : 太字
  • 4 : 下線
  • 7 : 反転(背景色と文字色を反転)

例えば、青色の文字に太字を適用する場合は、次のように記述します。

echo "\033[1;34mBold Blue Text\033[0m\n";

色とスタイルの組み合わせ


色とスタイルはセミコロンで区切って組み合わせることができます。例えば、黄色い背景に赤い文字で太字を設定するには、以下のように記述します。

echo "\033[1;31;43mBold Red on Yellow Background\033[0m\n";

このように、自由に色やスタイルを組み合わせることで、視覚的にわかりやすい出力をターミナル上で実現できます。

事例:カラフルなメッセージの作成


PHPでターミナルに色付きのメッセージを表示する具体的な例を紹介します。実際のスクリプトを使って、複数の色とスタイルを組み合わせてメッセージをカスタマイズする方法を解説します。

例1:シンプルなカラフルメッセージ


まずは、赤い文字で「エラーメッセージ」、緑の文字で「成功メッセージ」を表示する簡単な例です。

echo "\033[31mError: Something went wrong!\033[0m\n";
echo "\033[32mSuccess: Operation completed successfully.\033[0m\n";

この例では、\033[31mで赤色に設定した後にエラーメッセージを表示し、リセットコード\033[0mで色を元に戻しています。同様に、\033[32mで緑色に設定しています。

例2:複雑なメッセージのフォーマット


次に、異なる色とスタイルを組み合わせて、強調されたメッセージを作成してみます。

echo "\033[1;33mWarning:\033[0m \033[4;34mDisk space is running low.\033[0m\n";

この例では、太字の黄色で「Warning:」を表示し、その後、下線付きの青色で「Disk space is running low.」を表示しています。これにより、重要な部分を強調しつつ、メッセージ全体の視認性を向上させています。

例3:ステータス表示のシミュレーション


進行中の処理や状態をカラフルに表示することで、CLIツールのインタラクティビティを高めることができます。以下は、処理の進行状況を表示する例です。

echo "\033[32m[OK]\033[0m Database connection established.\n";
echo "\033[31m[FAIL]\033[0m Unable to find configuration file.\n";
echo "\033[33m[WARN]\033[0m Low memory warning.\n";

この例では、各ステータスを異なる色で表示することで、メッセージの内容を一目で理解できるようにしています。緑色は正常(OK)、赤色は失敗(FAIL)、黄色は警告(WARN)を意味しています。

コードのメンテナンスを簡単にするための工夫


ANSIエスケープコードを使う際に、コードが長くなりがちです。そのため、定数を定義してコードを簡潔に保つ工夫ができます。

define('COLOR_RED', "\033[31m");
define('COLOR_GREEN', "\033[32m");
define('COLOR_RESET', "\033[0m");

echo COLOR_RED . "This is a red message." . COLOR_RESET . "\n";
echo COLOR_GREEN . "This is a green message." . COLOR_RESET . "\n";

この方法を使うと、コードの可読性が向上し、修正も容易になります。

PHPスクリプトでのカラフルなロギングの実装


ログに色を付けることで、エラーメッセージや警告、成功メッセージを視覚的に区別しやすくなります。PHPでターミナル出力に色を付けたロギングを行う方法を具体的に解説します。

カラフルなログメッセージの基本


ログの内容に応じて色を変えることで、ターミナルでの作業効率を向上させることができます。例えば、エラーログは赤、警告は黄色、情報は青、成功は緑といった具合です。以下のコード例では、ログレベルに応じて色を付ける関数を作成します。

function logMessage($level, $message) {
    switch ($level) {
        case 'ERROR':
            $color = "\033[31m"; // 赤
            break;
        case 'WARNING':
            $color = "\033[33m"; // 黄
            break;
        case 'INFO':
            $color = "\033[34m"; // 青
            break;
        case 'SUCCESS':
            $color = "\033[32m"; // 緑
            break;
        default:
            $color = "\033[0m"; // リセット(デフォルト)
    }
    echo $color . "[$level] " . $message . "\033[0m\n";
}

// 使用例
logMessage('ERROR', 'Failed to connect to the database.');
logMessage('WARNING', 'Low disk space remaining.');
logMessage('INFO', 'User login successful.');
logMessage('SUCCESS', 'Data saved successfully.');

この関数は、ログレベルに応じて適切な色を選択し、メッセージをフォーマットして出力します。ログの種類が一目でわかるため、視認性が高まります。

ログの自動的なタイムスタンプ追加


ログメッセージにタイムスタンプを追加すると、発生した時刻を記録できます。タイムスタンプ付きのカラフルなログ関数を実装してみましょう。

function logMessageWithTimestamp($level, $message) {
    $timestamp = date('Y-m-d H:i:s');
    switch ($level) {
        case 'ERROR':
            $color = "\033[31m"; // 赤
            break;
        case 'WARNING':
            $color = "\033[33m"; // 黄
            break;
        case 'INFO':
            $color = "\033[34m"; // 青
            break;
        case 'SUCCESS':
            $color = "\033[32m"; // 緑
            break;
        default:
            $color = "\033[0m"; // リセット(デフォルト)
    }
    echo $color . "[$timestamp] [$level] " . $message . "\033[0m\n";
}

// 使用例
logMessageWithTimestamp('ERROR', 'Failed to connect to the database.');
logMessageWithTimestamp('WARNING', 'Low disk space remaining.');
logMessageWithTimestamp('INFO', 'User login successful.');
logMessageWithTimestamp('SUCCESS', 'Data saved successfully.');

このコードでは、date関数を使用して現在の日時を取得し、ログメッセージの先頭に追加しています。

ログファイルへの保存とターミナル出力の併用


ログメッセージをターミナルに表示するだけでなく、ファイルにも保存することで、後からの分析が可能になります。次のコードは、ファイルへの書き込みとカラフルなターミナル出力を同時に行う例です。

function logMessageWithFile($level, $message, $filePath) {
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$level] $message\n";

    // ファイルへの書き込み
    file_put_contents($filePath, $logEntry, FILE_APPEND);

    // カラフルなターミナル出力
    logMessageWithTimestamp($level, $message);
}

// 使用例
$logFile = 'app.log';
logMessageWithFile('ERROR', 'Failed to connect to the database.', $logFile);
logMessageWithFile('INFO', 'User logged in successfully.', $logFile);

この例では、file_put_contents関数を使ってログメッセージを指定したファイルに追記しつつ、ターミナルには色付きのメッセージを表示しています。

カラフルなロギングの利点


視覚的な区別ができるため、エラーや重要なメッセージを見逃しにくくなります。また、開発時にデバッグやトラブルシューティングが効率的に行えるようになります。

高度なANSIエスケープコードのカスタマイズ


ANSIエスケープコードをさらにカスタマイズすることで、複数の色やスタイルを組み合わせて、より複雑で視覚的に豊かな出力を実現できます。ここでは、高度なカスタマイズ方法を解説し、PHPでの具体的な実装例を紹介します。

複数のスタイルの組み合わせ


ANSIエスケープコードを使うと、複数のスタイルや色を同時に適用することが可能です。たとえば、太字の青文字で下線付き、背景が黄色のテキストを作成するには、次のようにします。

echo "\033[1;34;4;43mBold, Blue, Underlined Text on Yellow Background\033[0m\n";

この例では、次のコードを組み合わせています:

  • 1:太字
  • 34:青色の文字
  • 4:下線
  • 43:黄色の背景

すべてのスタイルをリセットするには、コード\033[0mを使います。スタイルを組み合わせる際は、セミコロンで区切ることで複数の設定を同時に適用できます。

動的に色を設定する関数


複雑なエスケープシーケンスを繰り返し使用するのは手間がかかります。そこで、カスタマイズした色とスタイルを動的に適用する関数を作成します。

function colorize($text, $foreground = null, $background = null, $options = []) {
    $codes = [];

    // 前景色の設定
    if ($foreground !== null) {
        $codes[] = $foreground;
    }

    // 背景色の設定
    if ($background !== null) {
        $codes[] = $background;
    }

    // オプション(太字、下線など)の設定
    foreach ($options as $option) {
        $codes[] = $option;
    }

    // ANSIエスケープシーケンスの作成
    $codeString = implode(';', $codes);
    return "\033[" . $codeString . "m" . $text . "\033[0m";
}

// 使用例
echo colorize("Dynamic Red Text with Yellow Background", "31", "43", ["1"]);
echo "\n";
echo colorize("Underlined Green Text", "32", null, ["4"]);

この関数では、前景色、背景色、オプション(スタイル)を引数として受け取り、動的にANSIエスケープコードを生成しています。これにより、色やスタイルの設定を柔軟に行えます。

カラーテーブルの実装


カラーテーブルを用意することで、すべての色とスタイルを事前定義し、コードの可読性を高めることができます。

const COLORS = [
    'black' => '30',
    'red' => '31',
    'green' => '32',
    'yellow' => '33',
    'blue' => '34',
    'magenta' => '35',
    'cyan' => '36',
    'white' => '37',
];

const BACKGROUNDS = [
    'black' => '40',
    'red' => '41',
    'green' => '42',
    'yellow' => '43',
    'blue' => '44',
    'magenta' => '45',
    'cyan' => '46',
    'white' => '47',
];

const STYLES = [
    'bold' => '1',
    'underline' => '4',
    'reversed' => '7',
];

// 使用例
echo colorize("Custom Style Text", COLORS['red'], BACKGROUNDS['yellow'], [STYLES['bold'], STYLES['underline']]);
echo "\n";

このように定数を定義しておくと、コードが読みやすくなり、修正やメンテナンスも簡単になります。

テキストのアニメーション効果


ANSIエスケープコードを活用して、簡単なテキストアニメーションを作成することもできます。以下は、テキストを1文字ずつ色を変えながら表示する例です。

$text = "Animating Text";
$colors = ["31", "32", "33", "34", "35", "36", "37"];

for ($i = 0; $i < strlen($text); $i++) {
    $color = $colors[$i % count($colors)];
    echo "\033[" . $color . "m" . $text[$i] . "\033[0m";
    usleep(100000); // 0.1秒の遅延
}

echo "\n";

このコードでは、文字列の各文字に異なる色を適用し、短い遅延を挟んで表示しています。これにより、アニメーションのような効果を実現できます。

まとめ


高度なANSIエスケープコードのカスタマイズにより、ターミナルでのテキスト表示をより豊かに演出できます。複数のスタイルや色の組み合わせ、動的なカスタマイズ関数、さらにはアニメーションの実装まで、さまざまな技術を駆使してPHPのCLIツールを強化しましょう。

ターミナルの互換性と注意点


ANSIエスケープコードは多くのターミナルでサポートされていますが、環境によって互換性や動作に違いがあります。PHPでターミナルに色付きテキストを表示する際に注意すべき点について解説します。

ターミナルごとの互換性の違い


すべてのターミナルがANSIエスケープコードを完全にサポートしているわけではありません。以下に、一般的なターミナルの互換性を示します。

  • Unix系ターミナル(Linux、macOSのデフォルトターミナル)
    Unix系のターミナルは、ほぼすべてANSIエスケープコードに対応しています。標準的な色設定やスタイル(太字、下線など)は問題なく使用できます。
  • Windowsのコマンドプロンプト(CMD)
    従来のCMDではANSIエスケープコードのサポートが限定的であり、色やスタイルが適切に表示されないことがあります。Windows 10以降では、設定を変更することでANSIエスケープコードのサポートを有効にできます。
  • Windows PowerShell
    PowerShellではバージョン5以降、ANSIエスケープコードに対するサポートが改善されています。ただし、すべてのスタイルが完全にサポートされているわけではありません。
  • Windows Terminal
    Windows Terminalは、最新のANSIエスケープコードのサポートが充実しており、カラフルな表示や複雑なスタイルの適用が可能です。

エスケープコードの互換性を考慮した実装方法


複数のターミナル環境で動作させる場合、互換性の問題を考慮した実装が必要です。以下のような工夫で、ターミナルごとの動作を切り替えることができます。

  • 環境変数でのターミナル判定
    TERMなどの環境変数をチェックすることで、現在のターミナルの種類を判別できます。たとえば、Windows CMDの場合はANSIエスケープコードを無効にするなどの処理を行います。
function supportsAnsiColors() {
    return (DIRECTORY_SEPARATOR !== '\\' || getenv('ANSICON') !== false || getenv('WT_SESSION') !== false);
}

if (supportsAnsiColors()) {
    echo "\033[32mThis terminal supports ANSI colors.\033[0m\n";
} else {
    echo "This terminal does not support ANSI colors.\n";
}

この例では、WindowsでもANSICONやWindows Terminalが利用可能な場合に限り、ANSIエスケープコードを有効にしています。

色とスタイルの標準化


異なるターミナルでの表示を統一するために、色とスタイルを標準化する方法を考えます。ANSIエスケープコードには「明るい色」や「標準の色」など、ターミナルごとに異なる解釈が存在するため、基本的な8色(黒、赤、緑、黄、青、マゼンタ、シアン、白)を基準に使用することが推奨されます。

コードのリセット忘れに注意


ANSIエスケープコードで色やスタイルを適用した後、リセットコード(\033[0m)を忘れると、以降の出力にも影響が及びます。これにより、意図しない色付きテキストが出力される可能性があります。常にリセットコードを使用して、影響範囲を最小限にすることが重要です。

ANSIエスケープコードが無効な環境での対処


ANSIエスケープコードが無効な環境では、コード自体を出力しないようにするか、プレーンテキストにフォールバックする処理を入れるのが一般的です。

function printColoredText($text, $colorCode) {
    if (supportsAnsiColors()) {
        echo "\033[" . $colorCode . "m" . $text . "\033[0m\n";
    } else {
        echo $text . "\n";
    }
}

// 使用例
printColoredText("Hello, World!", "31");

このように、ANSIエスケープコードが使用できない場合でも、標準的なテキスト出力を行うことで、互換性を確保できます。

まとめ


ターミナルの互換性を考慮してANSIエスケープコードを適用することで、クロスプラットフォームなCLIツールの開発が可能です。環境ごとの違いを把握し、互換性のないターミナルでも適切に対応できる実装を心がけましょう。

他の言語との違い:PHPの特異性


ANSIエスケープコードはさまざまなプログラミング言語で使用できますが、PHPには他の言語と比較して特有の注意点があります。ここでは、PHPでのANSIエスケープコードの使用における特徴や、他の言語との違いを解説します。

PHPと他の言語におけるCLI環境の違い


PHPはもともとWeb開発向けに設計された言語であり、CLI(コマンドラインインターフェース)用途は後から追加された機能です。そのため、PythonやRubyのようにCLIスクリプトのための豊富な標準ライブラリやパッケージが少ない点が異なります。PHPでCLIを使う場合は、他の言語よりも自分でエスケープコードを使った処理を実装することが多くなります。

PythonやRubyとの比較:エコシステムの違い


PythonやRubyでは、ANSIエスケープコードを使わずに色付きテキストを表示するためのパッケージ(例:PythonのcoloramaやRubyのrainbow)が豊富に揃っています。これらのライブラリは、クロスプラットフォームのサポートが充実しており、環境ごとの差異を吸収してくれます。PHPにも類似のライブラリがありますが、選択肢は限られており、基本的にエスケープコードを手動で記述する必要があります。

PHPのエスケープコード処理における特徴


PHPでは、ANSIエスケープコードを直接文字列に埋め込んで処理する方法が一般的です。他の言語と異なり、標準ライブラリで色付きテキストを扱うための直接的なサポートがないため、コードの繰り返しや冗長性が発生しやすくなります。そのため、ANSIエスケープコードの関数化や定数化を行い、再利用性を高める工夫が必要です。

PHPでのカスタム関数の活用例


ANSIエスケープコードを手動で記述する代わりに、PHPではカスタム関数を作成してコードの重複を避けることができます。以下は、他の言語と同様のライブラリ風にカラーテキストを生成する関数を実装した例です。

function styleText($text, $color = null, $bgColor = null, $options = []) {
    $codes = [];

    // カラーコード設定
    if ($color !== null) {
        $codes[] = $color;
    }
    if ($bgColor !== null) {
        $codes[] = $bgColor;
    }

    // オプションの追加(太字、下線など)
    foreach ($options as $option) {
        $codes[] = $option;
    }

    // ANSIエスケープシーケンスの作成
    $start = "\033[" . implode(';', $codes) . "m";
    $end = "\033[0m";

    return $start . $text . $end;
}

// 使用例
echo styleText("This is a styled message.", "32", "43", ["1", "4"]);

このように関数を使ってカスタムスタイルを適用することで、PHPでのCLIプログラムがより扱いやすくなります。

他の言語との違い:OS依存性の扱い


PHPは他の言語と同様、WindowsとUnix系での動作に違いがあります。ANSIエスケープコードのサポートはUnix系(Linux、macOS)で優れていますが、Windows環境では一部機能が制限される場合があります。他の言語では、Windows上での動作を改善するライブラリが多く提供されていますが、PHPではそのサポートが限られています。そのため、Windows向けには手動で設定を変更したり、エスケープコードを無効にする処理を組み込む必要があります。

PHPでANSIエスケープコードを使う利点と限界


PHPでのANSIエスケープコードの利点は、軽量な実装が可能であり、追加のライブラリをインストールする必要がない点です。しかし、その反面、複雑なカスタマイズを行う場合や、異なる環境での互換性を考慮する必要がある場合、他の言語に比べて手間がかかることがデメリットとなります。

他言語のライブラリ活用との違い


PHPでは、標準的なライブラリとしてANSIエスケープコードを扱うパッケージが充実していないため、自分でコードを作成する必要があります。他の言語で使用されるライブラリのような汎用性の高いツールをPHPで実現するには、関数の拡張や外部ライブラリの導入を検討する必要があります。

まとめ


PHPでのANSIエスケープコードの使用は、他のプログラミング言語と比較して独自の課題がありますが、カスタム関数の作成や環境依存性の考慮によって柔軟なカラーテキスト表示が可能です。適切な実装方法を選ぶことで、CLIツールの視認性とユーザーエクスペリエンスを向上させることができます。

実践:インタラクティブなカラフルメニューの作成


PHPでターミナル上にインタラクティブなカラフルメニューを表示する方法を解説します。ユーザーからの入力を受け付けて操作するCLIツールを作成し、視覚的にわかりやすいカラフルなメニューの作り方を紹介します。

カラフルメニューの基本構成


メニューを作成する際には、各項目に色やスタイルを付けることで、重要な部分を強調したり、選択肢を区別しやすくしたりします。以下の例では、PHPでシンプルなメニューを作成し、選択肢ごとに異なる色を適用します。

function displayMenu() {
    echo "\033[1;34m=== Main Menu ===\033[0m\n";
    echo "\033[32m1. Start New Game\033[0m\n";
    echo "\033[33m2. Load Game\033[0m\n";
    echo "\033[31m3. Exit\033[0m\n";
    echo "\033[1;34m=================\033[0m\n";
    echo "Choose an option: ";
}

// メニューの表示
displayMenu();
$userInput = trim(fgets(STDIN));

switch ($userInput) {
    case '1':
        echo "\033[32mStarting a new game...\033[0m\n";
        break;
    case '2':
        echo "\033[33mLoading the game...\033[0m\n";
        break;
    case '3':
        echo "\033[31mExiting the program. Goodbye!\033[0m\n";
        exit;
    default:
        echo "\033[31mInvalid option. Please try again.\033[0m\n";
}

この例では、各メニュー項目を異なる色で表示し、選択されたオプションに応じたメッセージをカラフルに表示します。これにより、視覚的なフィードバックが得られやすく、インタラクティブな操作感が向上します。

選択肢の強調と動的メニューの実装


ユーザーが選択したメニュー項目を強調表示することで、よりインタラクティブな操作感を演出できます。選択肢を動的に変更するメニューを実装してみましょう。

function displayInteractiveMenu($selectedOption = null) {
    $menuItems = [
        '1' => 'Start New Game',
        '2' => 'Load Game',
        '3' => 'Exit'
    ];

    echo "\033[1;34m=== Main Menu ===\033[0m\n";
    foreach ($menuItems as $key => $item) {
        if ($key === $selectedOption) {
            echo "\033[1;37;44m>> $item <<\033[0m\n"; // 背景青で強調表示
        } else {
            echo "\033[32m$key. $item\033[0m\n";
        }
    }
    echo "\033[1;34m=================\033[0m\n";
    echo "Choose an option: ";
}

// メニュー表示と選択
while (true) {
    displayInteractiveMenu();
    $userInput = trim(fgets(STDIN));

    if ($userInput === '3') {
        echo "\033[31mExiting the program. Goodbye!\033[0m\n";
        break;
    } elseif (isset($menuItems[$userInput])) {
        displayInteractiveMenu($userInput);
        echo "\033[32mYou selected: {$menuItems[$userInput]}\033[0m\n";
    } else {
        echo "\033[31mInvalid option. Please try again.\033[0m\n";
    }
}

このコードでは、選択したオプションを青色の背景で強調表示し、動的にメニューを再描画しています。ユーザーが有効な選択をするまでループし、選択肢がインタラクティブに反映されます。

カラフルな入力プロンプトとフィードバック


入力プロンプトを色付きにすることで、ユーザーの注目を集めやすくなります。また、フィードバックもカラフルにすることで、操作結果が一目でわかるようにしましょう。

function prompt($message, $color = "33") {
    echo "\033[" . $color . "m" . $message . "\033[0m ";
    return trim(fgets(STDIN));
}

// 使用例
$name = prompt("Enter your name:", "36");
echo "\033[32mHello, $name! Welcome to the game.\033[0m\n";

この関数では、プロンプトメッセージの色を指定できるようにし、ユーザーに対するインタラクションをカスタマイズしています。

リアルタイムのメニュー更新と非同期処理


より高度なカラフルメニューを作成するには、リアルタイムでメニューを更新する必要があります。ncurses拡張機能などを使うことで、より高度な非同期処理やリアルタイム更新を実現できますが、ここでは基本的なループ処理を用いたシンプルなリアルタイムメニューの例を示します。

function realTimeMenu() {
    $items = ["Option 1", "Option 2", "Option 3", "Exit"];
    $currentIndex = 0;

    while (true) {
        system('clear'); // 画面をクリア

        foreach ($items as $index => $item) {
            if ($index === $currentIndex) {
                echo "\033[1;37;42m>> $item <<\033[0m\n"; // 選択中の項目を緑色で強調
            } else {
                echo "\033[32m$item\033[0m\n";
            }
        }

        // ユーザー入力の取得
        $input = trim(fgets(STDIN));

        // メニューの操作
        if ($input === 'w' && $currentIndex > 0) {
            $currentIndex--;
        } elseif ($input === 's' && $currentIndex < count($items) - 1) {
            $currentIndex++;
        } elseif ($input === 'e') {
            echo "\033[32mYou selected: {$items[$currentIndex]}\033[0m\n";
            if ($items[$currentIndex] === "Exit") {
                break;
            }
        }
    }
}

// 実行
realTimeMenu();

この例では、wキーで上に移動し、sキーで下に移動、eキーで選択を確定します。選択された項目を緑色の背景で強調表示し、リアルタイムで更新することで、インタラクティブなメニュー操作が可能になります。

まとめ


PHPでターミナルアプリケーションを開発する際に、カラフルなメニューを実装することで、CLIツールの操作性と視覚的な魅力が向上します。エスケープコードを使ったカスタマイズやインタラクティブなメニューの構築方法を理解し、実践的なCLIツール開発に役立てましょう。

応用例:ターミナルアプリケーションのデザイン


ANSIエスケープコードを活用して、PHPでターミナルアプリケーションのユーザーインターフェースをデザインする応用例を紹介します。ここでは、カラフルなボーダーやセクション分割、動的なコンテンツ表示など、CLIアプリケーションを視覚的に改善する手法について解説します。

カラフルなボーダーの作成


ターミナルアプリケーションにボーダーを追加することで、画面を区切って見やすくすることができます。以下は、色付きのボーダーを使用してセクションを分割する例です。

function drawBorder($width, $colorCode = "34") {
    echo "\033[" . $colorCode . "m" . str_repeat("=", $width) . "\033[0m\n";
}

// 使用例
drawBorder(30, "34");
echo "\033[1;33mWelcome to the PHP Terminal App!\033[0m\n";
drawBorder(30, "34");

このコードでは、指定された幅でボーダーを描画し、その間にテキストを挿入します。ボーダーの色も引数で指定できるため、セクションごとに異なる色を使って視覚的な区別が可能です。

動的なセクションの切り替え


複数のセクションを持つアプリケーションでは、ユーザーの操作に応じて表示内容を切り替えることが重要です。以下のコード例では、メニューの選択に応じて異なるセクションの内容を表示します。

function displaySection($section) {
    system('clear'); // 画面をクリア

    switch ($section) {
        case 'home':
            echo "\033[1;32mHome Section\033[0m\n";
            echo "Welcome to the home section of the application.\n";
            break;
        case 'settings':
            echo "\033[1;33mSettings Section\033[0m\n";
            echo "Here you can configure your application settings.\n";
            break;
        case 'help':
            echo "\033[1;34mHelp Section\033[0m\n";
            echo "This section provides help and documentation.\n";
            break;
        default:
            echo "\033[31mUnknown section.\033[0m\n";
            break;
    }

    drawBorder(30, "34");
    echo "\033[1;37mUse 'h' for Home, 's' for Settings, 'p' for Help, 'q' to Quit.\033[0m\n";
}

// 初期セクションの表示
$currentSection = 'home';
displaySection($currentSection);

// ユーザー入力に応じてセクションを切り替える
while (true) {
    $input = trim(fgets(STDIN));

    if ($input === 'q') {
        echo "\033[31mExiting the program. Goodbye!\033[0m\n";
        break;
    } elseif ($input === 'h') {
        $currentSection = 'home';
    } elseif ($input === 's') {
        $currentSection = 'settings';
    } elseif ($input === 'p') {
        $currentSection = 'help';
    }

    // セクションの表示を更新
    displaySection($currentSection);
}

この例では、hキーでホームセクション、sキーで設定セクション、pキーでヘルプセクションに切り替え、qキーでプログラムを終了します。各セクションは異なる色でタイトルを表示し、動的に画面が更新されます。

進行状況バーの実装


進行状況を示すバーを実装することで、長時間の処理やファイルのダウンロードなどのフィードバックをユーザーに提供できます。

function showProgressBar($current, $total, $width = 50) {
    $percent = ($current / $total) * 100;
    $filled = round(($width * $current) / $total);
    $empty = $width - $filled;

    $bar = str_repeat("=", $filled) . str_repeat(" ", $empty);
    echo sprintf("\r\033[1;32m[%s] %d%%\033[0m", $bar, $percent);
    if ($current === $total) {
        echo "\n";
    }
}

// 進行状況バーのデモ
$totalSteps = 100;
for ($i = 1; $i <= $totalSteps; $i++) {
    showProgressBar($i, $totalSteps);
    usleep(50000); // 0.05秒の遅延
}

この進行状況バーは、=でバーを埋め、数値で進行状況を表示します。usleepで処理に遅延を加えることで、アニメーションのような効果を演出しています。

ユーザー入力の検証とフィードバック


ユーザーの入力が正しい形式であるかを検証し、不正な入力には色付きのエラーメッセージを表示することで、CLIのユーザーエクスペリエンスを向上させます。

function validateInput($input) {
    if (!preg_match('/^[a-zA-Z]+$/', $input)) {
        echo "\033[31mError: Invalid input. Please enter letters only.\033[0m\n";
        return false;
    }
    echo "\033[32mInput accepted: $input\033[0m\n";
    return true;
}

// 入力の検証ループ
while (true) {
    echo "Enter your name (letters only): ";
    $userInput = trim(fgets(STDIN));
    if (validateInput($userInput)) {
        break;
    }
}

このコードでは、ユーザーがアルファベット以外の文字を入力した場合、赤色のエラーメッセージを表示し、再度入力を促します。正しい形式の入力が行われるまでループを続けます。

まとめ


PHPでのターミナルアプリケーション開発において、ANSIエスケープコードを使ったデザインは、ユーザー体験を向上させる重要な要素です。カラフルなボーダー、動的なセクション切り替え、進行状況バーの実装により、CLIツールがより直感的で使いやすくなります。応用例を参考に、インタラクティブなターミナルアプリケーションを実現しましょう。

まとめ


本記事では、PHPでANSIエスケープコードを活用してターミナルに色付きテキストを表示する方法を詳しく解説しました。ANSIエスケープコードの基本から始まり、PHPでの使い方、色とスタイルの組み合わせ、インタラクティブなメニューの作成、ターミナルアプリケーションのデザインの応用例まで取り上げました。適切にANSIエスケープコードを使用することで、視覚的に魅力的で使いやすいCLIツールを開発できます。ターミナル環境の互換性を考慮しながら、カラフルでインタラクティブなターミナルアプリケーションを作成してみましょう。

コメント

コメントする

目次