Ctype print: примеры (PHP)
ctype_print(mixed $text): boolФункция ctype_print в PHP
Функция ctype_print проверяет, состоят ли все символы в переданной строке из печатаемых символов. Она принадлежит к семейству функций ctype, предназначенных для проверки типов символов в строке. Функция используется для валидации ввода, обработки текстовых данных, фильтрации строк перед выводом или сохранением.
Синтаксис функции:
ctype_print(mixed $text): bool
Функция принимает один обязательный аргумент:
- $text — проверяемая строка. Если передано не целое число (int) и не строка (string), функция вернет false. Начиная с PHP 8.1.0, передача не строки (не int) считается устаревшей и выдает предупреждение (E_WARNING).
Функция возвращает true, если каждый символ в строке $text является печатаемым (включая пробел), и false в противном случае. Управляющие символы (например, символ новой строки \n, табуляции \t), а также символы с кодами ниже 32 и выше 126 в ASCII считаются непечатаемыми.
Примеры использования ctype_print
var_dump(ctype_print('Hello World'));
var_dump(ctype_print('Hello\n'));
var_dump(ctype_print('Hello\tWorld'));bool(true) bool(false) bool(false)
var_dump(ctype_print(' ')); // только пробелы
var_dump(ctype_print('Hello123!'));
var_dump(ctype_print('Привет')); // кириллицаbool(true) bool(true) bool(true)
var_dump(ctype_print(''));
var_dump(ctype_print(123)); // число как integer
var_dump(ctype_print('123'));bool(false) bool(false) // для PHP 8.1+ с E_WARNING bool(true)
Похожие функции в PHP
Использование регулярного выражения для проверки печатаемых символов. Медленнее, но гибче.
function is_printable($str) {
return preg_match('/^[\x20-\x7E]+$/', $str) === 1;
}
var_dump(is_printable('Hello'));bool(true)
Фильтрация с использованием регулярных выражений.
var_dump(filter_var('Hello', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^[\x20-\x7E]+$/']]));string(5) "Hello" // false при несоответствии
ctype_print работает быстрее для простых проверок на ASCII-символы. preg_match и filter_var подходят для сложных шаблонов или многобайтовых кодировок.
Типичные ошибки
До PHP 8.1 функция пыталась преобразовать аргумент в строку, что могло привести к неожиданным результатам. С PHP 8.1 выдается предупреждение.
// PHP 8.0 и ниже
var_dump(ctype_print(123)); // false, т.к. '123' - печатаемая строка, но для числа функция возвращала false
// PHP 8.1+
var_dump(ctype_print(123)); // false и E_WARNING: ctype_print(): Argument of type int will be interpreted as stringbool(false) // с предупреждением в PHP 8.1+
Пустая строка не содержит печатаемых символов, поэтому функция возвращает false.
var_dump(ctype_print('')); // falsebool(false)
Функция работает на уровне байтов и не учитывает многобайтовые кодировки (UTF-8). Символы, выходящие за пределы ASCII, могут интерпретироваться некорректно.
$char = 'á';
var_dump(ctype_print($char)); // может вернуть false, так как символ не в диапазоне ASCIIbool(false)
Изменения в PHP
Передача аргумента, отличного от string (или int, который может быть преобразован в string), теперь вызывает предупреждение (E_WARNING). Ранее такие аргументы молча преобразовывались в строку.
В PHP 5.1 и выше функция всегда возвращала false для пустой строки. В более ранних версиях поведение могло отличаться.
Расширенные примеры
Проверка, что имя содержит только печатаемые ASCII-символы без управляющих кодов.
function validate_username($name) {
return ctype_print($name) && strlen($name) >= 3;
}
var_dump(validate_username('Alex123')); // true
var_dump(validate_username('Alex\n')); // falsebool(true) bool(false)
Удаление управляющих символов из строки.
function strip_non_printable($str) {
$result = '';
for ($i = 0; $i < strlen($str); $i++) {
$char = $str[$i];
if (ctype_print($char)) {
$result .= $char;
}
}
return $result;
}
echo strip_non_printable("Hello\tWorld\n");HelloWorld
Применение функции к каждому элементу массива.
$strings = ["Hello", "Test\n", "123 456", ""];
$results = array_map('ctype_print', $strings);
print_r($results);Array
(
[0] => 1
[1] =>
[2] => 1
[3] =>
)Альтернативная реализация с использованием ASCII-кодов.
function is_printable_custom($str) {
for ($i = 0; $i < strlen($str); $i++) {
$code = ord($str[$i]);
if ($code < 32 || $code > 126) {
return false;
}
}
return $str !== '';
}
var_dump(is_printable_custom('Hello'));bool(true)
Аналоги в других языках
Метод строки проверяет, все ли символы печатаемые. Учитывает Unicode.
print('Hello'.isprintable()) # True
print('Hello\n'.isprintable()) # FalseTrue False
В JS нет встроенной функции, используют RegExp для ASCII-диапазона.
function isPrintable(str) {
return /^[\x20-\x7E]+$/.test(str);
}
console.log(isPrintable('Hello')); // true
console.log(isPrintable('Hello\n')); // falsetrue false
Проверка в запросах с помощью регулярных выражений.
SELECT 'Hello' REGEXP '^[[:print:]]+$' AS is_printable;is_printable: 1
Отличие от PHP: функция ctype_print проверяет только ASCII, в то время как аналоги в Python и MySQL могут учитывать локаль или Unicode.