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

Функция ctype_graph в PHP: проверка печатных символов
Раздел: Работа со строками
ctype_graph(mixed $text): bool

Функция ctype_graph в PHP проверяет, все ли символы в переданной строке являются видимыми (печатными) и создают визуальное отображение, исключая пробелы.

Назначение и применение

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

Аргументы функции

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

  • $text - строка для проверки. В PHP до версии 8.4.0 ожидался параметр типа string. Начиная с PHP 8.4.0, функция ожидает аргумент типа string, но при передаче данных других типов происходит их автоматическое приведение к строке с выдачей предупреждения.

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

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

Проверка строки, содержащей только видимые символы:

$result = ctype_graph("Hello123!");
var_dump($result);
bool(true)

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

$result = ctype_graph("Hello 123");
var_dump($result);
bool(false)

Проверка строки с управляющими символами:

$result = ctype_graph("Hello\tWorld");
var_dump($result);
bool(false)

Пустая строка всегда возвращает ложь:

$result = ctype_graph("");
var_dump($result);
bool(false)
Похожие функции в PHP

Проверяет, все ли символы являются печатными, включая пробел. Отличие от ctype_graph в том, что ctype_print допускает пробелы.

preg_match

Регулярные выражения предоставляют более гибкую проверку. Например, для проверки на видимые символы без пробелов можно использовать шаблон /^[\x21-\x7E]+$/.

filter_var

С фильтром FILTER_VALIDATE_REGEXP позволяет выполнить сложные проверки с использованием регулярных выражений.

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

Распространенные ошибки
Передача нестроковых значений

До PHP 8.4.0 функция ожидала строковый параметр. Передача других типов приводила к преобразованию. С PHP 8.4.0 выдается предупреждение.

$result = ctype_graph(12345);
var_dump($result);
Deprecated: ctype_graph(): Argument #1 ($text) must be of type string, int given
bool(false)
Проверка строк с национальными символами

Функция работает только с ASCII символами. Символы за пределами ASCII (например, кириллица) всегда возвращают ложь.

$result = ctype_graph("Привет");
var_dump($result);
bool(false)
Игнорирование пустой строки

Пустая строка возвращает ложь, что иногда не ожидается в логике проверки.

$input = "";
if (ctype_graph($input)) {
    echo "Валидно";
} else {
    echo "Невалидно";
}
Невалидно
Изменения в версиях PHP

В PHP 8.4.0 добавлена строгая проверка типа аргумента. При передаче нестрокового значения теперь выдается уведомление об устаревшем использовании (Deprecated). В будущих версиях это может привести к ошибке типа.

До PHP 8.4.0 аргумент автоматически преобразовывался в строку, если это было возможно. Теперь такое поведение считается устаревшим.

// Поведение в PHP 8.3.0 и ранее
$result = ctype_graph(123); // Преобразуется в "123"
// Поведение в PHP 8.4.0
$result = ctype_graph(123); // Deprecated notice
Расширенные примеры
Валидация пароля

Проверка, что пароль содержит только видимые символы и не имеет пробелов.

Пример php
function validatePassword($password) {
    if (ctype_graph($password)) {
        return "Пароль содержит только видимые символы";
    } else {
        return "Пароль содержит недопустимые символы или пробелы";
    }
}
echo validatePassword("MyPass123!");
Пароль содержит только видимые символы
Фильтрация строк

Удаление из строки всех невидимых символов, кроме пробелов.

Пример php
function removeNonGraph($string) {
    $result = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $char = $string[$i];
        if (ctype_graph($char)) {
            $result .= $char;
        }
    }
    return $result;
}
echo removeNonGraph("Hello\tWorld\nTest");
HelloWorldTest
Генерация случайного кода

Создание строки из видимых символов заданной длины.

Пример php
function generateCode($length) {
    $code = '';
    $chars = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
    for ($i = 0; $i < $length; $i++) {
        $code .= $chars[random_int(0, strlen($chars) - 1)];
    }
    return $code;
}
$code = generateCode(10);
echo "Код: $code\n";
echo "Проверка: " . (ctype_graph($code) ? 'OK' : 'FAIL');
Код: .`-~J\'3S)
Проверка: OK
Пакетная проверка массива

Фильтрация массива строк, оставляя только строки с видимыми символами.

Пример php
$data = ["Hello", "Test 123", "No\tSpaces", "Another", ""];
$filtered = array_filter($data, 'ctype_graph');
print_r($filtered);
Array
(
    [0] => Hello
    [3] => Another
)
Аналоги в других языках

Ctype graph в Python

Модуль string содержит константу printable, но она включает пробелы. Для точного аналога нужна проверка с использованием str.isprintable() и исключения пробела.

import string
def is_graph(text):
    return all(ch.isprintable() and ch != ' ' for ch in text)

print(is_graph("Hello123!"))
True

Ctype graph в Javascript

Прямого аналога нет. Можно использовать регулярное выражение.

function ctypeGraph(str) {
    return /^[\x21-\x7E]+$/.test(str);
}
console.log(ctypeGraph("Hello123!"));
true

Ctype graph в MySQL

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

SELECT 'Hello123!' REGEXP '^[[:graph:]]+$';
1

PHP ctype_graph function comments

En
Ctype graph Check for any printable character(s) except space