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

Полное руководство по ctype_cntrl: примеры и особенности
Раздел: Работа со строками
ctype_cntrl(mixed $text): bool

Описание функции ctype_cntrl

Функция ctype_cntrl в PHP используется для проверки, состоит ли переданная строка только из управляющих символов. Управляющими считаются символы с кодами от 0 до 31, а также символ DEL (127) в таблице ASCII.

Назначение

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

Аргументы

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

  • $text - проверяемая строка. До PHP 8.1 функция ожидала строковый аргумент, но могла работать и с другими типами, что приводило к неочевидному поведению. С PHP 8.1 передача нестроковых аргументов устарела.

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

Базовые проверки
// Проверка строки, содержащей только управляющие символы (перевод строки и табуляция)
var_dump(ctype_cntrl("\n\t"));
bool(true)
// Проверка строки, содержащей печатаемые символы
var_dump(ctype_cntrl("Hello\n"));
bool(false)
Проверка специальных символов
// Символ с кодом 7 (BEL) - управляющий
var_dump(ctype_cntrl("\x07"));
bool(true)
// Символ с кодом 127 (DEL) - управляющий
var_dump(ctype_cntrl(chr(127)));
bool(true)
// Символ пробела (код 32) - не управляющий
var_dump(ctype_cntrl(' '));
bool(false)

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

Регулярные выражения

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

var_dump(preg_match('/^[[:cntrl:]]+$/', "\n\r\t"));
int(1)
Другие функции семейства ctype
  • ctype_print — проверяет печатаемые символы. Противоположна по смыслу ctype_cntrl для символов, отличных от пробела.
  • ctype_space — проверяет пробельные символы (включая пробел, табуляцию, перевод строки).

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

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

Передача нестроковых аргументов
// До PHP 8.1 возвращает false для целых чисел
var_dump(ctype_cntrl(123));
Deprecated: ctype_cntrl(): Argument of type int will be interpreted as string in the future
Пустая строка

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

var_dump(ctype_cntrl(''));
bool(false)
Символы юникода

Функция работает только с ASCII символами.

// Символ каретки (U+2038) не является ASCII управляющим символом
var_dump(ctype_cntrl("\xE2\x80\xB8"));
bool(false)

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

PHP 8.1

Передача аргументов, отличных от строк (int, float, null, bool, объекты с методом __toString), теперь вызывает уведомление об устаревании (deprecation notice). В будущих версиях это может привести к ошибке TypeError.

PHP 8.0

Особых изменений для этой функции не было. Общее повышение стабильности и предсказуемости работы с типами.

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

Фильтрация управляющих символов из строки
Пример php
function remove_control_chars(string $input): string {
    $result = '';
    for ($i = 0; $i < strlen($input); $i++) {
        if (!ctype_cntrl($input[$i])) {
            $result .= $input[$i];
        }
    }
    return $result;
}
echo remove_control_chars("Hello\x07World\n");
HelloWorld
Валидация строки для безопасного вывода
Пример php
function is_safe_for_display(string $text): bool {
    // Строка не должна состоять только из управляющих символов
    return !ctype_cntrl($text) && ctype_print(trim($text));
}
var_dump(is_safe_for_display("Hello"));
var_dump(is_safe_for_display("\n\n\n"));
bool(true)
bool(false)
Анализ бинарных данных
Пример php
function analyze_binary_string(string $data): array {
    $control = 0;
    $printable = 0;
    for ($i = 0; $i < strlen($data); $i++) {
        if (ctype_cntrl($data[$i])) {
            $control++;
        } elseif (ctype_print($data[$i])) {
            $printable++;
        }
    }
    return ['control' => $control, 'printable' => $printable];
}
print_r(analyze_binary_string("Test\x00\x01\nString"));
Array
(
    [control] => 3
    [printable] => 9
)

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

Python

В Python используется метод str.isprintable(), который возвращает False, если строка содержит управляющие символы.

print("\n\t".isprintable())
print("Hello".isprintable())
False
True
JavaScript

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

console.log(/^[\x00-\x1F\x7F]+$/.test("\n\t"));
console.log(/^[\x00-\x1F\x7F]+$/.test("Hello"));
true
false
MySQL

В MySQL можно использовать регулярные выражения или функцию HEX для анализа строк.

SELECT '\n\t' REGEXP '^[[:cntrl:]]+$' AS is_control;
is_control: 1

PHP ctype_cntrl function comments

En
Ctype cntrl Check for control character(s)