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

Проверка строк на цифры при помощи 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 существуют другие функции для проверки числового содержания строк.

is_numeric

Проверяет, является ли переменная числом или числовой строкой. В отличие от ctype_digit, она допускает знаки (+, -), десятичные точки и экспоненциальную запись.

<?php
var_dump(is_numeric('123'));   // true
var_dump(is_numeric('-12.3')); // true
var_dump(is_numeric('12e3'));  // true
?>
filter_var с FILTER_VALIDATE_INT

Фильтрация переменной как целого числа. Позволяет задать диапазон значений и учитывает знак.

<?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
?>
Ожидание true для пустой строки

Пустая строка возвращает false, что иногда упускается при валидации обязательных полей.

<?php
var_dump(ctype_digit('')); // false
?>
Проверка строк, содержащих пробелы

Пробелы не являются цифрами, поэтому результат будет false.

<?php
var_dump(ctype_digit('123 45')); // false
?>

Изменения в версиях PHP

PHP 8.1

Передача в функцию аргумента, не являющегося строкой, теперь вызывает уведомление об устаревании (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 8.0 ужесточена типизация в целом, что могло повлиять на контекст использования функции.

Расширенные примеры

Валидация пользовательского ввода

Проверка, что переданный идентификатор заказа состоит только из цифр.

Пример php
<?php
$orderId = $_POST['order_id'] ?? '';
if (ctype_digit($orderId) && $orderId !== '') {
    echo 'Идентификатор корректен.';
} else {
    echo 'Идентификатор должен содержать только цифры.';
}
?>
Фильтрация массива строк

Отбор элементов массива, состоящих исключительно из цифр.

Пример php
<?php
$data = ['123', '12a', '456', '0', '-789'];
$numericStrings = array_filter($data, 'ctype_digit');
print_r($numericStrings);
?>
Array
(
    [0] => 123
    [2] => 456
    [3] => 0
)
Совместное использование с trim

Если требуется игнорировать начальные и конечные пробелы, их нужно предварительно удалить.

Пример php
<?php
$input = '  12345  ';
$trimmed = trim($input);
var_dump(ctype_digit($trimmed)); // true
?>
Проверка строки, представляющей большое число

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

Пример php
<?php
$bigNumber = '123456789012345678901234567890';
var_dump(ctype_digit($bigNumber)); // true
?>
Сравнение с is_int

Важно не путать проверку типа переменной и содержимого строки.

Пример php
<?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
<?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())   # True

Ctype 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') вернет 123

Ctype digit в MySQL

Функция REGEXP для сопоставления с шаблоном или операторы LIKE с отрицанием.

SELECT '12345' REGEXP '^[0-9]+$'; -- 1 (true)
SELECT '12a45' REGEXP '^[0-9]+$'; -- 0 (false)

Главное отличие PHP-функции в том, что ctype_digit работает только со строками и не принимает другие форматы чисел.

PHP ctype_digit function comments

En
Ctype digit Check for numeric character(s)