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)
Проверяет, все ли символы являются печатными, включая пробел. Отличие от ctype_graph в том, что ctype_print допускает пробелы.
Регулярные выражения предоставляют более гибкую проверку. Например, для проверки на видимые символы без пробелов можно использовать шаблон /^[\x21-\x7E]+$/.
С фильтром 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 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Проверка, что пароль содержит только видимые символы и не имеет пробелов.
function validatePassword($password) {
if (ctype_graph($password)) {
return "Пароль содержит только видимые символы";
} else {
return "Пароль содержит недопустимые символы или пробелы";
}
}
echo validatePassword("MyPass123!");Пароль содержит только видимые символы
Удаление из строки всех невидимых символов, кроме пробелов.
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
Создание строки из видимых символов заданной длины.
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
Фильтрация массива строк, оставляя только строки с видимыми символами.
$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