Ctype xdigit: примеры (PHP)

Проверка строк на шестнадцатеричные символы с помощью ctype_xdigit
Раздел: Работа со строками
ctype_xdigit(mixed $text): bool

Функция ctype_xdigit в PHP

Назначение

Функция ctype_xdigit проверяет, состоит ли переданная строка только из шестнадцатеричных цифр. Она применяется для валидации данных, которые должны быть представлены в шестнадцатеричном формате, например, хешей, цветов в формате HEX, идентификаторов.

Сигнатура и аргументы
bool ctype_xdigit(mixed $text)

Функция принимает один обязательный аргумент:

  • $text — проверяемая строка. До PHP 8.1 функция ожидала строковый параметр. Если передавался не строковый тип, он преобразовывался в строку. С PHP 8.1 передача не строкового параметра вызывает уведомление о deprecated, а с PHP 8.3 — предупреждение E_WARNING.

Функция возвращает true, если каждый символ в строке является допустимой шестнадцатеричной цифрой (0-9, a-f, A-F). Для пустой строки возвращает false.

Примеры использования ctype_xdigit

Базовые проверки
<?php
$values = ["1a2F", "1234567890abcdef", "", "12G4", "0x1A"];

foreach ($values as $value) {
    var_dump($value);
    var_dump(ctype_xdigit($value));
    echo "\n";
}
string(4) "1a2F"
bool(true)

string(16) "1234567890abcdef"
bool(true)

string(0) ""
bool(false)

string(4) "12G4"
bool(false)

string(4) "0x1A"
bool(false)
Проверка HEX-цвета
<?php
function isValidHexColor(string $color): bool {
    $color = ltrim($color, '#');
    return ctype_xdigit($color) && (strlen($color) === 6 || strlen($color) === 3);
}

echo isValidHexColor('#FF00AA') ? 'true' : 'false'; // true
echo isValidHexColor('#F0A') ? 'true' : 'false';   // true
echo isValidHexColor('#FF00AG') ? 'true' : 'false'; // false
true
true
false

Альтернативные функции в PHP

preg_match

Регулярные выражения предоставляют более гибкую проверку. Для точного соответствия функции ctype_xdigit можно использовать шаблон /^[0-9a-fA-F]+$/.

<?php
$str = "abc123";
var_dump(preg_match('/^[0-9a-fA-F]+$/', $str)); // 1
filter_var

С фильтром FILTER_VALIDATE_REGEXP можно выполнить похожую проверку.

<?php
$str = "abc123";
var_dump(filter_var($str, FILTER_VALIDATE_REGEXP, ["options"=>["regexp"=>'/^[0-9a-fA-F]+$/']]));
Когда что использовать
  • ctype_xdigit — наиболее быстрый и простой вариант для строгой проверки на шестнадцатеричные символы.
  • preg_match — предпочтителен, когда нужна дополнительная логика (проверка длины, групп).
  • filter_var — удобен в контексте общей фильтрации данных.

Типичные ошибки

Передача не строкового аргумента

Начиная с PHP 8.1, передача не строкового аргумента вызывает уведомление о нерекомендуемом использовании.

<?php
// PHP 8.1+
var_dump(ctype_xdigit(123)); // Deprecated: ctype_xdigit(): Argument of type int will be interpreted as string
Неверная интерпретация префикса

Функция не распознает префикс '0x' как часть шестнадцатеричного числа.

<?php
var_dump(ctype_xdigit('0xFF')); // false
bool(false)
Проверка строк с пробелами

Пробелы и другие невидимые символы приводят к false.

<?php
var_dump(ctype_xdigit('a b')); // false
var_dump(ctype_xdigit("a\nb")); // false

Изменения в функциях семейства ctype

PHP 8.1

Передача аргумента не строкового типа в функции ctype теперь вызывает уведомление уровня E_DEPRECATED. Ранее не строковые аргументы молча преобразовывались в строку.

PHP 8.3

Передача не строкового аргумента теперь вызывает ошибку уровня E_WARNING. Это изменение сделано для улучшения строгости типов.

<?php
// PHP 8.3
var_dump(ctype_xdigit(null));
Warning: ctype_xdigit(): Argument of type null will be interpreted as string in the future in ...
bool(false)

Расширенные примеры использования

Валидация MAC-адреса

Функция может быть частью проверки MAC-адреса, где разделители удаляются перед проверкой.

Пример php
<?php
function isValidMacAddress(string $mac): bool {
    $cleaned = str_replace([':', '-', '.'], '', $mac);
    return ctype_xdigit($cleaned) && strlen($cleaned) === 12;
}

echo isValidMacAddress('00:1A:2B:3C:4D:5E') ? 'Верный MAC' : 'Неверный MAC';
Верный MAC
Пакетная проверка массива данных
Пример php
<?php
$ids = ['a1b2c3', 'xyz123', 'deadbeef', '12345G'];
$valid = array_filter($ids, 'ctype_xdigit');
print_r($valid);
Array
(
    [0] => a1b2c3
    [2] => deadbeef
)
Генерация безопасного шестнадцатеричного токена
Пример php
<?php
function generateHexToken(int $length): string {
    do {
        $bytes = random_bytes($length);
        $token = bin2hex($bytes);
    } while (!ctype_xdigit($token)); // Проверка избыточна после bin2hex, но демонстрирует принцип
    return substr($token, 0, $length);
}
echo generateHexToken(16);
Обработка пользовательского ввода для шестнадцатеричных значений
Пример php
<?php
$input = $_POST['hex_code'] ?? '';
if (ctype_xdigit($input)) {
    $decimal = hexdec($input);
    echo "Десятичное значение: $decimal";
} else {
    echo "Введены недопустимые символы.";
}

Аналоги в других языках программирования

Ctype xdigit в Python

Метод str.ishexdigit() проверяет, все ли символы строки являются шестнадцатеричными. В отличие от PHP, он корректно обрабатывает пустую строку, возвращая False.

print("1a2F".ishexdigit())  # True
print("12G4".ishexdigit())  # False
print("".ishexdigit())      # False
True
False
False

Ctype xdigit в Javascript

Регулярное выражение /^[0-9a-fA-F]+$/. В JS нет встроенной функции, аналогичной ctype_xdigit.

console.log(/^[0-9a-fA-F]+$/.test("1a2F")); // true
console.log(/^[0-9a-fA-F]+$/.test("12G4")); // false
true
false

Ctype xdigit в MySQL

Можно использовать функцию HEX() или регулярные выражения с оператором REGEXP.

SELECT '1a2F' REGEXP '^[0-9A-Fa-f]+$' AS is_hex; -- 1
SELECT '12G4' REGEXP '^[0-9A-Fa-f]+$' AS is_hex; -- 0

PHP ctype_xdigit function comments

En
Ctype xdigit Check for character(s) representing a hexadecimal digit