【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は空文字列に変換されるため、それぞれtrueとfalseの結果になります。配列やnullのような非スカラー値が渡された場合は、PHPは警告を発し、falseを返します。このように、ctype_xdigit関数は、データの形式が期待する16進数であるかを確認する際に役立ちます。
ctype_xdigit関数は、引数を内部で文字列に変換した後、その文字列がすべて16進数文字(0-9, A-F, a-f)で構成されているかを確認します。数値を与えた場合も文字列化されて検査され、例えば整数123は'123'としてtrueを返しますが、float型の1.23は小数点を含むためfalseです。trueは'1'に、falseやnullは空文字列''に変換され、空文字列は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を返します。空文字列(またはfalseやnullが変換された空文字列)に対してもfalseを返します。
似た関数としてctype_digitがありますが、これは文字列がすべて10進数(0-9)であるかをチェックします。ctype_xdigitが16進数を判定するのに対し、ctype_digitは10進数に特化しています。
一方、is_numeric関数は、引数が「数値」であるか、または「数値として有効な文字列」であるかを判定する点で異なります。is_numericは小数点や負の数、指数表記を含む文字列も数値とみなしますが、ctype_*関数は文字そのものの種類をチェックするため、これらの形式ではfalseを返します。例えば、"12.3"はis_numericではtrueですが、ctype_xdigitやctype_digitではfalseです。このように、ctype_*関数は文字列の各文字のタイプを厳密にチェックし、is_numericは文字列全体が数値として解釈可能かを判断します。
ctype_xdigit()関数は、引数を内部的に文字列に変換し、その文字列のすべての文字が16進数(0-9, A-F, a-f)であるかを厳密に確認します。空文字列や、それに変換されるfalse、nullといった値に対しては常にfalseを返します。特に注意が必要なのは、"0x1A"のような16進数プレフィックスを含む文字列は、純粋な文字型チェックのためfalseとなる点です。一方、整数値0xAF(10進数175)は文字列"175"として扱われるためtrueとなります。論理値trueも文字列"1"に変換されtrueです。is_numeric()関数は、引数全体が数値として有効かを判定し、浮動小数点数や負の数も許容しますが、"0x1A"形式は数値とはみなしません。これらの関数の挙動の違いを理解し、利用目的に応じて適切な関数を選択することが重要です。