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

Проверка буквенно-цифровых символов с помощью ctype_alnum
Раздел: Работа со строками
ctype_alnum(mixed $text): bool

Функция ctype_alnum в PHP

Функция ctype_alnum() проверяет, состоит ли переданная строка только из буквенно-цифровых символов. Она принадлежит к семейству функций ctype, которые используют текущую локаль для определения категорий символов.

Назначение

Используется для валидации строковых данных, когда необходимо убедиться, что строка содержит только буквы и цифры, без пробелов, знаков пунктуации или специальных символов. Типичные случаи применения: проверка логинов, паролей, кодов.

Аргументы

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

  • $text (string|int) — проверяемое значение. Если передано целое число от -128 до 255, оно будет обработано как ASCII-код одного символа. Начиная с PHP 8.1.0, передача нестроковых аргументов устарела.

Возвращает true, если каждый символ строки является буквой или цифрой в текущей локали, иначе возвращает false.

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

Базовые проверки

Проверка строки, содержащей только буквы и цифры:

$value1 = 'Hello123';
var_dump(ctype_alnum($value1));
bool(true)

Строка с пробелом возвращает ложь:

$value2 = 'Hello 123';
var_dump(ctype_alnum($value2));
bool(false)
Проверка отдельных символов

Использование числового аргумента (ASCII-код):

var_dump(ctype_alnum(65)); // 'A'
var_dump(ctype_alnum(50)); // '2'
var_dump(ctype_alnum(33)); // '!'
bool(true)
bool(true)
bool(false)

Похожие функции в PHP

preg_match

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

$value = 'Test123';
$result = preg_match('/^[a-zA-Z0-9]+$/', $value);
filter_var

Используется с фильтром FILTER_VALIDATE_REGEXP для сложных проверок или FILTER_VALIDATE_ALNUM в PHP 8.3+.

$value = 'Test123';
$result = filter_var($value, FILTER_VALIDATE_ALNUM);
is_numeric и ctype_alpha

Комбинация этих функций может заменить ctype_alnum, но требует раздельной проверки.

function custom_alnum($str) {
    return ctype_alpha($str) || ctype_digit($str);
}

ctype_alnum предпочтительнее для простых проверок на буквенно-цифровые символы из-за скорости. preg_match используют при необходимости проверки по сложным шаблонам.

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

Неправильная обработка граничных значений

Передача пустой строки возвращает ложь:

var_dump(ctype_alnum(''));
bool(false)
Ожидание true для строк с подчеркиванием

Символ '_' не считается буквенно-цифровым:

var_dump(ctype_alnum('user_name123'));
bool(false)
Зависимость от локали

Для не-ASCII символов результат зависит от настроек локали:

setlocale(LC_CTYPE, 'ru_RU.UTF-8');
var_dump(ctype_alnum('Привет123'));

Результат может различаться в разных системах.

Передача массива или объекта

До PHP 8.1 это приводило к предупреждению и false:

var_dump(ctype_alnum(['test']));

В PHP 8.1+ это вызывает уведомление об устаревании.

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

PHP 8.1.0

Передача нестроковых аргументов теперь вызывает уведомление об устаревании. Ранее целые числа и строки, содержащие числа, интерпретировались как ASCII-коды.

// До PHP 8.1
ctype_alnum(123); // Проверка символа '}'
// С PHP 8.1 - устарело
PHP 8.3.0

Добавлен фильтр FILTER_VALIDATE_ALNUM для функции filter_var().

$value = 'Test123';
var_dump(filter_var($value, FILTER_VALIDATE_ALNUM));
string(7) "Test123"

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

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

Проверка, что логин содержит только буквы и цифры без пробелов:

Пример php
function validateLogin($login) {
    return ctype_alnum($login) && strlen($login) >= 3;
}

echo validateLogin('User123') ? 'Valid' : 'Invalid'; // Valid
echo validateLogin('User 123') ? 'Valid' : 'Invalid'; // Invalid
Обработка массива значений

Фильтрация массива строк по критерию буквенно-цифрового содержания:

Пример php
$items = ['Hello', 'Test123', 'Hello World', '123', ''];
$filtered = array_filter($items, 'ctype_alnum');
print_r($filtered);
Array
(
    [0] => Hello
    [1] => Test123
    [3] => 123
)
Проверка строк с кириллицей

При правильной локали функция работает с не-ASCII символами:

Пример php
setlocale(LC_CTYPE, 'ru_RU.UTF-8');
var_dump(ctype_alnum('Тест123')); // Может вернуть true
var_dump(ctype_alnum('Test123')); // true
Сравнение производительности

Демонстрация разницы в скорости работы с регулярными выражениями:

Пример php
$value = 'Test123456';

// Быстрее
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    ctype_alnum($value);
}
echo 'ctype_alnum: ' . (microtime(true) - $start);

Функции ctype обычно работают быстрее preg_match для простых проверок.

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

Python

Метод str.isalnum() проверяет строку на буквенно-цифровые символы.

text = "Hello123"
print(text.isalnum())  # True
print("Hello 123".isalnum())  # False
True
False
JavaScript

Используют регулярное выражение, так как нет встроенной функции.

function isAlnum(str) {
    return /^[a-zA-Z0-9]+$/.test(str);
}
console.log(isAlnum('Hello123')); // true
MySQL

Оператор REGEXP для проверки паттерна.

SELECT 'Hello123' REGEXP '^[[:alnum:]]+$' AS is_alnum;
1

Основное отличие PHP-функции — зависимость от текущей локали, тогда как в Python проверка Unicode, а в JavaScript обычно только ASCII.

PHP ctype_alnum function comments

En
Ctype alnum Check for alphanumeric character(s)