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

Руководство по функции 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

preg_match с шаблоном

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

function is_printable($str) {
    return preg_match('/^[\x20-\x7E]+$/', $str) === 1;
}
var_dump(is_printable('Hello'));
bool(true)
filter_var с FILTER_VALIDATE_REGEXP

Фильтрация с использованием регулярных выражений.

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 string
bool(false) // с предупреждением в PHP 8.1+
Ожидание true для пустой строки

Пустая строка не содержит печатаемых символов, поэтому функция возвращает false.

var_dump(ctype_print('')); // false
bool(false)
Неучет многобайтовых символов

Функция работает на уровне байтов и не учитывает многобайтовые кодировки (UTF-8). Символы, выходящие за пределы ASCII, могут интерпретироваться некорректно.

$char = 'á';
var_dump(ctype_print($char)); // может вернуть false, так как символ не в диапазоне ASCII
bool(false)

Изменения в PHP

PHP 8.1.0

Передача аргумента, отличного от string (или int, который может быть преобразован в string), теперь вызывает предупреждение (E_WARNING). Ранее такие аргументы молча преобразовывались в строку.

Ранние версии

В PHP 5.1 и выше функция всегда возвращала false для пустой строки. В более ранних версиях поведение могло отличаться.

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

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

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

Пример php
function validate_username($name) {
    return ctype_print($name) && strlen($name) >= 3;
}
var_dump(validate_username('Alex123')); // true
var_dump(validate_username('Alex\n')); // false
bool(true)
bool(false)
Фильтрация непечатаемых символов

Удаление управляющих символов из строки.

Пример php
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
Пакетная проверка массива строк

Применение функции к каждому элементу массива.

Пример php
$strings = ["Hello", "Test\n", "123 456", ""];
$results = array_map('ctype_print', $strings);
print_r($results);
Array
(
    [0] => 1
    [1] => 
    [2] => 1
    [3] => 
)
Сравнение с проверкой через ord()

Альтернативная реализация с использованием ASCII-кодов.

Пример php
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)

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

Python: str.isprintable()

Метод строки проверяет, все ли символы печатаемые. Учитывает Unicode.

print('Hello'.isprintable())  # True
print('Hello\n'.isprintable()) # False
True
False
JavaScript: Регулярное выражение

В JS нет встроенной функции, используют RegExp для ASCII-диапазона.

function isPrintable(str) {
    return /^[\x20-\x7E]+$/.test(str);
}
console.log(isPrintable('Hello')); // true
console.log(isPrintable('Hello\n')); // false
true
false
MySQL: REGEXP

Проверка в запросах с помощью регулярных выражений.

SELECT 'Hello' REGEXP '^[[:print:]]+$' AS is_printable;
is_printable: 1

Отличие от PHP: функция ctype_print проверяет только ASCII, в то время как аналоги в Python и MySQL могут учитывать локаль или Unicode.

PHP ctype_print function comments

En
Ctype print Check for printable character(s)