Ctype digit: примеры (PHP)
ctype_digit(mixed $text): boolФункция ctype_digit
Функция ctype_digit проверяет, содержит ли переданная строка только цифровые символы. Она относится к группе функций расширения ctype, которые предназначены для проверки типов символов в строке.
Основное применение функции — валидация входящих строковых данных, когда требуется убедиться, что значение состоит исключительно из десятичных цифр (0-9). Это полезно при проверке числовых идентификаторов, кодов, номеров или перед преобразованием строки в целочисленный тип.
Функция принимает один обязательный параметр:
- $text (string|int) — проверяемая строка. Если передано целое число (int), оно будет неявно преобразовано в строку. Начиная с PHP 8.1, передача данных, отличных от строк, вызывает устаревание (deprecation notice).
Возвращаемое значение: true, если каждый символ строки является десятичной цифрой, иначе — false. Пустая строка возвращает false.
Простые примеры
Ниже приведены базовые случаи использования функции.
<?php
var_dump(ctype_digit('12345'));
?>bool(true)
<?php
var_dump(ctype_digit('12a45'));
?>bool(false)
<?php
var_dump(ctype_digit('-123'));
?>bool(false)
<?php
var_dump(ctype_digit(''));
?>bool(false)
<?php
var_dump(ctype_digit(12345));
?>// До PHP 8.1: bool(true) // Начиная с PHP 8.1: bool(true), но может вызывать предупреждение о передаче не строки.
Похожие функции в PHP
В PHP существуют другие функции для проверки числового содержания строк.
Проверяет, является ли переменная числом или числовой строкой. В отличие от ctype_digit, она допускает знаки (+, -), десятичные точки и экспоненциальную запись.
<?php
var_dump(is_numeric('123')); // true
var_dump(is_numeric('-12.3')); // true
var_dump(is_numeric('12e3')); // true
?>Фильтрация переменной как целого числа. Позволяет задать диапазон значений и учитывает знак.
<?php
var_dump(filter_var('123', FILTER_VALIDATE_INT)); // int(123)
var_dump(filter_var('-123', FILTER_VALIDATE_INT)); // int(-123)
var_dump(filter_var('0123', FILTER_VALIDATE_INT)); // int(123)
?>Использование preg_match дает максимальную гибкость, но менее эффективно для простых проверок.
<?php
var_dump(preg_match('/^\d+$/', '12345')); // 1 (true)
?>Выбор функции: ctype_digit оптимальна для строгой проверки на наличие только цифр (0-9) в строке. Для проверки целых чисел со знаком или чисел с плавающей точкой применяют is_numeric или filter_var.
Типичные ошибки
До PHP 8.1 функция пыталась преобразовать аргумент в строку, что могло приводить к неочевидным результатам. Сейчас это вызывает предупреждение.
<?php
// PHP 8.1+
var_dump(ctype_digit(123)); // bool(true) с deprecation notice
?>Функция корректно обрабатывает такие строки, но важно помнить, что при преобразовании в число ведущие нули могут потеряться.
<?php
var_dump(ctype_digit('00123')); // true
?>Пустая строка возвращает false, что иногда упускается при валидации обязательных полей.
<?php
var_dump(ctype_digit('')); // false
?>Пробелы не являются цифрами, поэтому результат будет false.
<?php
var_dump(ctype_digit('123 45')); // false
?>Изменения в версиях PHP
Передача в функцию аргумента, не являющегося строкой, теперь вызывает уведомление об устаревании (E_DEPRECATED). Ранее нестроковые аргументы преобразовывались в строку.
<?php
// В PHP 8.0 и ниже:
ctype_digit(123); // true, без предупреждений
// В PHP 8.1 и выше:
// Возникает: Deprecated: ctype_digit(): Argument of type int will be interpreted as string in the future
?>Значимых изменений в поведении функции не было. Однако, в PHP 8.0 ужесточена типизация в целом, что могло повлиять на контекст использования функции.
Расширенные примеры
Проверка, что переданный идентификатор заказа состоит только из цифр.
<?php
$orderId = $_POST['order_id'] ?? '';
if (ctype_digit($orderId) && $orderId !== '') {
echo 'Идентификатор корректен.';
} else {
echo 'Идентификатор должен содержать только цифры.';
}
?>Отбор элементов массива, состоящих исключительно из цифр.
<?php
$data = ['123', '12a', '456', '0', '-789'];
$numericStrings = array_filter($data, 'ctype_digit');
print_r($numericStrings);
?>Array
(
[0] => 123
[2] => 456
[3] => 0
)Если требуется игнорировать начальные и конечные пробелы, их нужно предварительно удалить.
<?php
$input = ' 12345 ';
$trimmed = trim($input);
var_dump(ctype_digit($trimmed)); // true
?>Функция работает с числами любой длины, так как обрабатывает строку посимвольно.
<?php
$bigNumber = '123456789012345678901234567890';
var_dump(ctype_digit($bigNumber)); // true
?>Важно не путать проверку типа переменной и содержимого строки.
<?php
$var = 123;
var_dump(is_int($var)); // true
var_dump(ctype_digit($var)); // true с предупреждением в PHP 8.1+
$var = '123';
var_dump(is_int($var)); // false
var_dump(ctype_digit($var)); // true
?>Функции ctype не предназначены для многобайтовых кодировок. Для Unicode цифр они вернут false.
<?php
// Арабские цифры (UTF-8)
$arabicDigits = '١٢٣';
var_dump(ctype_digit($arabicDigits)); // false
?>Аналоги в других языках
Ctype digit в Python
Метод str.isdigit() для строк. Он проверяет наличие только цифр, но также распознает специальные цифровые символы (например, верхние индексы). Более строгий аналог — str.isdecimal().
print('12345'.isdigit()) # True
print('12a45'.isdigit()) # False
print('①②③'.isdigit()) # True (спецсимволы)
print('123'.isdecimal()) # TrueCtype digit в Javascript
Регулярное выражение /^\d+$/.test() или метод Number.isInteger() после преобразования, но он не работает со строками напрямую.
console.log(/^\d+$/.test('12345')); // true
console.log(/^\d+$/.test('12a45')); // false
console.log(Number.isInteger(parseInt('123'))); // true, но parseInt('123abc') вернет 123Ctype digit в MySQL
Функция REGEXP для сопоставления с шаблоном или операторы LIKE с отрицанием.
SELECT '12345' REGEXP '^[0-9]+$'; -- 1 (true)
SELECT '12a45' REGEXP '^[0-9]+$'; -- 0 (false)Главное отличие PHP-функции в том, что ctype_digit работает только со строками и не принимает другие форматы чисел.