Ctype cntrl: примеры (PHP)
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_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
Передача аргументов, отличных от строк (int, float, null, bool, объекты с методом __toString), теперь вызывает уведомление об устаревании (deprecation notice). В будущих версиях это может привести к ошибке TypeError.
Особых изменений для этой функции не было. Общее повышение стабильности и предсказуемости работы с типами.
Расширенные примеры
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
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)
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 используется метод str.isprintable(), который возвращает False, если строка содержит управляющие символы.
print("\n\t".isprintable())
print("Hello".isprintable())False True
В JavaScript нет прямой встроенной функции, но можно использовать регулярное выражение.
console.log(/^[\x00-\x1F\x7F]+$/.test("\n\t"));
console.log(/^[\x00-\x1F\x7F]+$/.test("Hello"));true false
В MySQL можно использовать регулярные выражения или функцию HEX для анализа строк.
SELECT '\n\t' REGEXP '^[[:cntrl:]]+$' AS is_control;is_control: 1