Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】ctype_xdigit()関数の使い方

ctype_xdigit関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

ctype_xdigit関数は、指定された文字列がすべて16進数の数字で構成されているかどうかを判定する関数です。16進数の数字とは、10進数で使われる'0'から'9'までの数字に加え、'a'から'f'まで、または大文字の'A'から'F'までのアルファベットを指します。この関数は、引数として検証したい文字列を一つ受け取ります。もし、その文字列内のすべての文字がこれらの16進数の数字である場合、関数は真(true)を返します。反対に、文字列内に一つでも16進数の数字ではない文字(例えば、'g'や'z'、記号など)が含まれている場合、関数は偽(false)を返します。

具体的な利用シーンとしては、例えばプログラム内で色コードやMACアドレス、ハッシュ値など、16進数で表現されるデータを扱う際に、その書式が正しいかを検証したい場合に非常に役立ちます。ユーザーからの入力データが意図しない文字を含んでいないかを確認し、データの整合性を保つためにも使われます。なお、空の文字列を引数として渡した場合、この関数はfalseを返します。PHP 8.1以降では、文字列型以外の値を引数として渡すことは非推奨となっており、PHP 8.4環境では、意図しない挙動を防ぐためにも、常に文字列型の引数を渡すことを推奨いたします。正確かつ安全なコードを書く上で、このような文字種判定関数は重要な役割を果たします。

構文(syntax)

1<?php
2
3$text_string = "0123456789ABCDEFabcdef";
4$is_hexadecimal = ctype_xdigit($text_string);
5
6?>

引数(parameters)

mixed $text

  • mixed $text: 16進数文字かどうかをチェックする文字列

戻り値(return)

bool

引数で渡された文字列の全ての文字が16進数文字(0-9, a-f, A-F)である場合に true を返します。それ以外の場合は false を返します。

サンプルコード

PHP ctype_xdigitで16進数チェックする

1<?php
2
3/**
4 * ctype_xdigit() 関数の使用例を示します。
5 *
6 * この関数は、入力された値がすべて16進数の文字 (0-9, A-F, a-f) で構成されているかを確認します。
7 * PHPは内部的に引数を文字列に変換してチェックします。
8 *
9 * @param mixed $value チェックする値。
10 * @return void
11 */
12function demonstrateCtypeXdigit(mixed $value): void
13{
14    // ctype_xdigit() は、引数が文字列に変換された際、その文字列が
15    // 0-9, A-F, a-f の文字のみで構成されていれば true を返します。
16    $isHexDigit = ctype_xdigit($value);
17
18    // 入力値と型を分かりやすく表示します。
19    // 非スカラー値の場合、get_debug_type() で型名を表示します。
20    $displayValue = is_scalar($value) ? var_export($value, true) : get_debug_type($value);
21    
22    echo "入力: {$displayValue} (型: " . get_debug_type($value) . ") => ";
23    if ($isHexDigit) {
24        echo "すべて16進数の文字です。\n";
25    } else {
26        echo "16進数以外の文字を含んでいるか、適切でない型です。\n";
27    }
28}
29
30// --- ctype_xdigit() 関数のさまざまな使用例 ---
31
32echo "--- 文字列のテスト --- \n";
33// 1. 有効な16進数文字列
34demonstrateCtypeXdigit("1A3F");         // 数字と大文字の英字
35demonstrateCtypeXdigit("0123456789abcdef"); // 数字と小文字の英字
36demonstrateCtypeXdigit("ABCDEF");       // 大文字の英字のみ
37demonstrateCtypeXdigit("000");          // 数字のみ (これも有効な16進数とみなされます)
38
39// 2. 無効な16進数文字列 (16進数以外の文字を含む)
40demonstrateCtypeXdigit("GHIJ");         // G, H, I, J は16進数ではない
41demonstrateCtypeXdigit("123-abc");      // ハイフンは16進数ではない
42demonstrateCtypeXdigit("hello world");  // スペースやその他の文字を含む
43demonstrateCtypeXdigit("!@#$");         // 特殊文字を含む
44
45// 3. 空文字列
46demonstrateCtypeXdigit("");             // 空文字列は false を返します
47
48echo "\n--- 数値やその他の型のテスト (PHPは文字列に変換してチェック) --- \n";
49// 4. 数値 (PHPは内部的に文字列に変換してチェックします)
50demonstrateCtypeXdigit(12345);          // int 12345 は文字列 '12345' に変換され、true
51demonstrateCtypeXdigit(0xAF);           // int 175 (16進数のAF) は文字列 '175' に変換され、true
52demonstrateCtypeXdigit(1.23);           // float 1.23 は文字列 '1.23' に変換され、false ('.' が16進数ではないため)
53demonstrateCtypeXdigit(true);           // bool true は文字列 '1' に変換され、true
54demonstrateCtypeXdigit(false);          // bool false は空文字列 '' に変換され、false
55
56// 5. その他の型 (警告やエラーが発生する場合もあります)
57demonstrateCtypeXdigit([]);             // 配列は警告を発生させ、false
58demonstrateCtypeXdigit(null);           // null は空文字列 '' に変換され、false
59
60?>

ctype_xdigit関数は、与えられた値がすべて16進数の文字(0-9, A-F, a-f)で構成されているかを検査するPHPの関数です。引数$textにはあらゆる型の値を指定できますが、PHPは内部的にこの値を文字列に変換してからチェックを行います。

この関数は、引数が文字列に変換された後、その文字列が完全に16進数文字のみで構成されている場合にtrueを返します。例えば、「1A3F」や「0123456789abcdef」のような文字列はtrueとなります。一方、「GHIJ」のように16進数以外の文字を含む文字列や、「123-abc」のように記号を含む文字列はfalseを返します。空文字列もfalseを返します。

数値や真偽値が引数として渡された場合、PHPはそれらを文字列として解釈します。例えば、整数12345は文字列「12345」として扱われtrueを返しますが、浮動小数点数1.23は文字列「1.23」となり、小数点が含まれるためfalseを返します。trueは文字列「1」に、falseは空文字列に変換されるため、それぞれtruefalseの結果になります。配列やnullのような非スカラー値が渡された場合は、PHPは警告を発し、falseを返します。このように、ctype_xdigit関数は、データの形式が期待する16進数であるかを確認する際に役立ちます。

ctype_xdigit関数は、引数を内部で文字列に変換した後、その文字列がすべて16進数文字(0-9, A-F, a-f)で構成されているかを確認します。数値を与えた場合も文字列化されて検査され、例えば整数123'123'としてtrueを返しますが、float型の1.23は小数点を含むためfalseです。true'1'に、falsenullは空文字列''に変換され、空文字列はfalseを返します。配列やオブジェクトなどの非スカラー値を渡すと、警告が発生したり常にfalseが返されたりしますので注意が必要です。安全に使用するため、事前に引数を文字列型に変換するか、文字列であることを前提とした値に利用することをお勧めします。

PHP ctype_xdigitとctype_digit, is_numeric比較

1<?php
2
3/**
4 * プログラミング言語PHPのctype_xdigit関数の基本的な使い方と、
5 * ctype_digitおよびis_numericとの違いを比較して示します。
6 *
7 * ctype_xdigit() は、引数として渡された文字列(または文字列に変換可能な値)の
8 * すべての文字が16進数(0-9, A-F, a-f)である場合にtrueを返します。
9 * 1文字でも16進数ではない文字が含まれている場合や、空の文字列に対してはfalseを返します。
10 *
11 * ctype_digit() は、同様にすべての文字が10進数(0-9)である場合にtrueを返します。
12 *
13 * is_numeric() は、引数が数値であるか、数値として有効な文字列である場合にtrueを返します。
14 * 浮動小数点数、負の数、指数表記なども「数値」として判定可能です。
15 * ctype_* 関数とは異なり、文字列のすべての文字が特定のタイプである必要はありません。
16 *
17 * ctype_* 関数は、mixed型の引数を内部的に文字列に変換してからチェックを行います。
18 * 例えば、整数値は文字列として扱われます(例: 123 は "123")。
19 * 論理値 true は "1"、false や null は "" (空文字列) に変換されます。
20 */
21function demonstrateCtypeXdigitAndComparison(): void
22{
23    echo "--- ctype_xdigit() 関数のデモンストレーションと関連関数の比較 ---" . PHP_EOL;
24    echo "  (ctype_* 関数は、引数を内部的に文字列に変換してチェックします)" . PHP_EOL;
25
26    $testValues = [
27        "123",       // 10進数、16進数、数値文字列
28        "ABC",       // 16進数 (大文字)
29        "aBf",       // 16進数 (小文字も含む)
30        "0x1A",      // 16進数プレフィックスを含む文字列 (ctype_* は純粋な文字型チェックのためfalse)
31        "FF G",      // スペースを含む文字列
32        "Hello",     // 16進数ではない文字列
33        "12.3",      // 小数点を含む文字列
34        "-10",       // 負の数を示す文字列
35        " ",         // 空白文字のみの文字列
36        "",          // 空の文字列
37        123,         // 整数値 (文字列 "123" として扱われる)
38        0xAF,        // 整数値 (16進数リテラル、内部的には10進数175として扱われ、文字列 "175" に変換)
39        12.3,        // 浮動小数点数 (文字列 "12.3" として扱われる)
40        true,        // 論理値 true (文字列 "1" に変換される)
41        false,       // 論理値 false (文字列 "" に変換される)
42        null,        // null値 (文字列 "" に変換される)
43    ];
44
45    foreach ($testValues as $value) {
46        $type = gettype($value);
47        $displayValue = var_export($value, true); // var_export は値の型情報も考慮して表示
48
49        // ctype_xdigit() の結果
50        $ctypeXdigitResult = ctype_xdigit($value);
51
52        // ctype_digit() の結果
53        $ctypeDigitResult = ctype_digit($value);
54
55        // is_numeric() の結果
56        $isNumericResult = is_numeric($value);
57
58        echo PHP_EOL;
59        echo "値: {$displayValue} (PHP型: {$type})" . PHP_EOL;
60        echo "  - ctype_xdigit(): " . ($ctypeXdigitResult ? 'true' : 'false') . PHP_EOL;
61        echo "  - ctype_digit():  " . ($ctypeDigitResult ? 'true' : 'false') . PHP_EOL;
62        echo "  - is_numeric():   " . ($isNumericResult ? 'true' : 'false') . PHP_EOL;
63
64        // 特殊な挙動の補足説明
65        if (($value === "" || $value === false || $value === null) && !$ctypeXdigitResult && !$ctypeDigitResult) {
66            echo "    *補足: ctype_* 関数は、空文字列(またはそれに変換される値)に対しては常にfalseを返します。" . PHP_EOL;
67        }
68        if ($value === "0x1A") {
69            echo "    *補足: '0x1A' は16進数プレフィックスを含む文字列ですが、ctype_* 関数は純粋な文字の型をチェックするためfalseです。" . PHP_EOL;
70            echo "           is_numeric() もこの形式の文字列を直接の数値とはみなさないためfalseです。" . PHP_EOL;
71        }
72        if (is_int($value) && $value === 0xAF) { // 0xAF は整数 175
73            echo "    *補足: 整数 '0xAF' (10進数175) は文字列 '175' として扱われ、ctype_xdigit()/digit() は true を返します。" . PHP_EOL;
74        }
75        if ($value === true) {
76            echo "    *補足: 論理値 true は文字列 '1' に変換され、ctype_xdigit()/digit()/is_numeric() は true を返します。" . PHP_EOL;
77        }
78        if ($value === false) {
79            echo "    *補足: 論理値 false は文字列 '' に変換され、ctype_* は false、is_numeric() は false を返します。" . PHP_EOL;
80        }
81    }
82}
83
84// 関数を実行して結果を表示
85demonstrateCtypeXdigitAndComparison();

PHPのctype_xdigit関数は、指定された文字列のすべての文字が16進数(0-9、A-F、a-f)であるかどうかを判定します。引数$textにはどのような型の値でも渡せますが、内部的には文字列に変換されてチェックされます。例えば整数値123は文字列"123"として、論理値true"1"として扱われます。戻り値は、すべての文字が16進数であればtrueを、それ以外の場合はfalseを返します。空文字列(またはfalsenullが変換された空文字列)に対してもfalseを返します。

似た関数としてctype_digitがありますが、これは文字列がすべて10進数(0-9)であるかをチェックします。ctype_xdigitが16進数を判定するのに対し、ctype_digitは10進数に特化しています。

一方、is_numeric関数は、引数が「数値」であるか、または「数値として有効な文字列」であるかを判定する点で異なります。is_numericは小数点や負の数、指数表記を含む文字列も数値とみなしますが、ctype_*関数は文字そのものの種類をチェックするため、これらの形式ではfalseを返します。例えば、"12.3"is_numericではtrueですが、ctype_xdigitctype_digitではfalseです。このように、ctype_*関数は文字列の各文字のタイプを厳密にチェックし、is_numericは文字列全体が数値として解釈可能かを判断します。

ctype_xdigit()関数は、引数を内部的に文字列に変換し、その文字列のすべての文字が16進数(0-9, A-F, a-f)であるかを厳密に確認します。空文字列や、それに変換されるfalsenullといった値に対しては常にfalseを返します。特に注意が必要なのは、"0x1A"のような16進数プレフィックスを含む文字列は、純粋な文字型チェックのためfalseとなる点です。一方、整数値0xAF(10進数175)は文字列"175"として扱われるためtrueとなります。論理値trueも文字列"1"に変換されtrueです。is_numeric()関数は、引数全体が数値として有効かを判定し、浮動小数点数や負の数も許容しますが、"0x1A"形式は数値とはみなしません。これらの関数の挙動の違いを理解し、利用目的に応じて適切な関数を選択することが重要です。

関連コンテンツ