Ctype xdigit: примеры (PHP)
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)
<?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
Регулярные выражения предоставляют более гибкую проверку. Для точного соответствия функции ctype_xdigit можно использовать шаблон /^[0-9a-fA-F]+$/.
<?php
$str = "abc123";
var_dump(preg_match('/^[0-9a-fA-F]+$/', $str)); // 1
С фильтром 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
Передача аргумента не строкового типа в функции ctype теперь вызывает уведомление уровня E_DEPRECATED. Ранее не строковые аргументы молча преобразовывались в строку.
Передача не строкового аргумента теперь вызывает ошибку уровня 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-адреса, где разделители удаляются перед проверкой.
<?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
$ids = ['a1b2c3', 'xyz123', 'deadbeef', '12345G'];
$valid = array_filter($ids, 'ctype_xdigit');
print_r($valid);
Array
(
[0] => a1b2c3
[2] => deadbeef
)
<?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
$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