【PHP8.x】ctype_cntrl関数の使い方

作成日: 更新日:

ctype_cntrl関数は、指定された文字列のすべての文字が制御文字であるかどうかを判定する関数です。制御文字とは、画面上に直接表示される通常の文字とは異なり、改行、タブ、NULL文字、エスケープシーケンスなど、コンピューターやターミナルの動作を制御するための特殊な機能を持つ文字を指します。具体的には、ASCIIコードの0x00(NUL)から0x1F(US)までの範囲、および0x7F(DEL)がこれに該当します。

この関数は、引数として受け取った文字列中のすべての文字が制御文字であればtrue(真)を返します。もし文字列に一つでも制御文字ではない文字が含まれていたり、あるいは空の文字列が渡されたりした場合はfalse(偽)を返します。

システム開発において、ユーザーからの入力データに予期せぬ制御文字が含まれていないかを検証したり、テキストファイルの処理時に不要な制御文字を除去したりする際などに非常に役立ちます。例えば、データベースに保存する前にデータをクリーンアップする用途や、ログファイルから情報を抽出する際に特殊な文字をフィルタリングする用途などが考えられます。この関数を活用することで、データの整合性を保ち、プログラムの安定性や信頼性を高めることができます。

基本的な使い方

構文(syntax)

<?php
var_dump(ctype_cntrl("\n"));
?>

引数(parameters)

string $text

  • string $text: チェック対象の文字列

戻り値(return)

bool

指定された文字が制御文字かどうかを判定し、真偽値を返します。

サンプルコード

PHP ctype_cntrl で制御文字か判定する

<?php

/**
 * ctype_cntrl() 関数を使用して、文字列が制御文字のみで構成されているかを確認する例。
 *
 * 制御文字とは、表示可能な文字ではなく、出力デバイスを制御するために使用される文字です。
 * 通常、ASCII値の0x00-0x1F (0-31) および 0x7F (127) に該当します。
 */
function demonstrateCtypeCntrl(): void
{
    // 例1: 制御文字のみを含む文字列 (改行、タブ)
    $string1 = "\n\t";
    echo "文字列 '{$string1}' (改行とタブ) が制御文字のみか確認:\n";
    var_dump(ctype_cntrl($string1)); // 期待値: bool(true)
    echo "\n";

    // 例2: 制御文字と表示可能な文字が混在する文字列
    $string2 = "Hello\nWorld";
    echo "文字列 '{$string2}' (表示可能な文字と改行) が制御文字のみか確認:\n";
    // 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' は制御文字ではないため、false を返す
    var_dump(ctype_cntrl($string2)); // 期待値: bool(false)
    echo "\n";

    // 例3: 表示可能な文字のみを含む文字列
    $string3 = "PHP 8.4";
    echo "文字列 '{$string3}' (表示可能な文字のみ) が制御文字のみか確認:\n";
    var_dump(ctype_cntrl($string3)); // 期待値: bool(false)
    echo "\n";

    // 例4: 空の文字列
    $string4 = "";
    echo "空の文字列 '' が制御文字のみか確認:\n";
    // ctype_* 関数は、空の文字列に対しては常に false を返す
    var_dump(ctype_cntrl($string4)); // 期待値: bool(false)
    echo "\n";

    // 例5: 特定のASCII制御文字 (BEL - ベル)
    $string5 = "\x07"; // ASCII 07 は BEL (ベル) 文字
    echo "文字列 '{$string5}' (ASCII BEL文字) が制御文字のみか確認:\n";
    var_dump(ctype_cntrl($string5)); // 期待値: bool(true)
    echo "\n";
}

// デモンストレーション関数を実行
demonstrateCtypeCntrl();

?>

PHPのctype_cntrl関数は、与えられた文字列がすべて「制御文字」で構成されているかを判別します。制御文字とは、一般的な表示可能な文字(英数字や記号など)とは異なり、画面やプリンターなどの出力デバイスを制御するために使われる特殊な文字のことです。通常、ASCII値の0x00から0x1F(0から31)と0x7F(127)に該当する文字がこれにあたります。

この関数はstring $textという引数で検査対象の文字列を受け取ります。そして、文字列内のすべての文字が制御文字であった場合にtrueを、一つでも制御文字でない文字が含まれている場合や、文字列が空であった場合はfalseというブール値を返します。

サンプルコードでは、この関数の様々な使用例が示されています。例えば、改行文字(\n)やタブ文字(\t)のように制御文字のみで構成された文字列に対してはtrueが返されます。一方、「Hello\nWorld」のように表示可能な文字と制御文字が混在する文字列や、「PHP 8.4」のような表示可能な文字のみの文字列、さらには空の文字列に対してはfalseが返されることが確認できます。特に、空の文字列はどのctype_*関数でもfalseを返す点に注意が必要です。この関数は、文字列が特定の形式に準拠しているかを確認する際に役立ちます。

ctype_cntrl関数は、引数の文字列が全て制御文字(ASCII値0x00-0x1Fおよび0x7F)で構成されている場合にのみtrueを返します。文字列に一つでも表示可能な文字が含まれる場合や、空の文字列の場合はfalseとなりますのでご注意ください。特に、この関数はロケール設定に依存せず、シングルバイト文字を前提として動作します。そのため、UTF-8などのマルチバイト文字を含む文字列に対しては、意図しない結果を返す可能性があります。マルチバイト文字の判定が必要な場合は、mb_check_encoding関数など、文字エンコーディングを考慮した別の関数を検討してください。この関数は、主に特定の制御文字の有無を確認する入力値のサニタイズや検証で役立ちますが、適用範囲をよく理解して使いましょう。

【PHP8.x】ctype_cntrl関数の使い方 | いっしー@Webエンジニア