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

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

Функция ctype_lower входит в состав расширения ctype языка PHP. Она предназначена для проверки строки на наличие только строчных буквенных символов.

Принцип работы

Функция анализирует каждый символ переданной строки. Возвращает true, если строка не пуста и каждый ее байт представляет собой строчную букву в текущей локали. В противном случае возвращается false.

Синтаксис
bool ctype_lower ( mixed $text )
Аргументы
  • $text (mixed) – проверяемая строка. До версии PHP 8.1.0 принимались нестроковые аргументы, которые преобразовывались в целое число и трактовались как ASCII-код символа. Начиная с PHP 8.1.0 передача нестроковых аргументов вызывает уведомление об устаревании (deprecated).
Область применения

Основное применение – валидация ввода, когда необходимо убедиться, что строка состоит исключительно из букв в нижнем регистре (например, имя файла, часть идентификатора, проверка пароля на отсутствие заглавных букв).

Простые примеры

Базовые случаи работы функции:

$result1 = ctype_lower('abc');
var_dump($result1);
bool(true)
$result2 = ctype_lower('Abc');
var_dump($result2);
bool(false)

Функция чувствительна к небуквенным символам:

$result3 = ctype_lower('hello world');
var_dump($result3);
bool(false)
$result4 = ctype_lower('привет'); // Кириллические буквы
var_dump($result4);
bool(false) // Зависит от локали. При стандартной локали C/Latin-1 кириллица не распознается как буква.

Особый случай – пустая строка:

$result5 = ctype_lower('');
var_dump($result5);
bool(false)
Похожие функции в PHP
  • ctype_upper() – проверяет наличие только заглавных букв. Прямая противоположность ctype_lower().
  • preg_match() с регулярным выражением, например, /^[a-z]+$/ или /^\\p{Ll}+$/u для Unicode. Используется для более сложных паттернов и поддержки Unicode без зависимости от локали.
  • strtolower() == $string – сравнение исходной строки с ее версией в нижнем регистре. Учитывает локаль, но требует полного преобразования строки, что может быть менее эффективно, чем посимвольная проверка ctype_lower().
Критерии выбора

ctype_lower() предпочтительна для простых ASCII-строк, где важна скорость. Для проверки строк в Unicode (кириллица, другие алфавиты) надежнее использовать preg_match() с модификатором /u.

Распространенные ошибки
1. Неявное преобразование нестроковых типов (устарело в PHP 8.1)
// До PHP 8.1.0
$result = ctype_lower(97); // 97 - код ASCII для 'a'
var_dump($result);
bool(true) // Неочевидное поведение
2. Игнорирование локали при работе с не-ASCII символами
setlocale(LC_CTYPE, 'C'); // Локаль по умолчанию
$result = ctype_lower('абв');
var_dump($result);
bool(false) // Кириллица не воспринимается как буквы
3. Ожидание true для пустой строки

Разработчики иногда забывают, что пустая строка возвращает false, что может нарушить логику проверки.

$input = '';
if (ctype_lower($input)) {
    echo 'Строка в нижнем регистре';
} else {
    echo 'Не в нижнем регистре или пуста';
}
Не в нижнем регистре или пуста
Изменения в версиях PHP
  • PHP 8.1.0: Передача аргумента, отличного от строки (string), теперь вызывает уведомление уровня E_DEPRECATED. Ранее такие аргументы неявно преобразовывались в строку или интерпретировались как ASCII-коды.
  • PHP 8.0.0: Функция больше не возвращает false при передаче пустой строки (''), если ранее было установлено нестандартное значение локали через setlocale(). Теперь поведение стабильно – пустая строка всегда возвращает false.
Расширенные примеры
Валидация пользовательского имени файла

Требование: имя файла должно содержать только строчные латинские буквы и цифры, но начинаться с буквы.

function isValidFilename(string $name): bool {
    if (strlen($name) === 0) return false;
    $firstChar = $name[0];
    $rest = substr($name, 1);
    return ctype_lower($firstChar) && ctype_alnum($rest);
}

var_dump(isValidFilename('test123'));
var_dump(isValidFilename('Test123'));
var_dump(isValidFilename('123test'));
bool(true)
bool(false)
bool(false)
Фильтрация массива строк

Выбор из списка только тех слов, которые полностью написаны в нижнем регистре.

$words = ['Hello', 'world', 'PHP', 'ctype', 'Lower', 'UPPER'];
$lowercaseWords = array_filter($words, 'ctype_lower');
print_r($lowercaseWords);
Array
(
    [1] => world
    [3] => ctype
)
Проверка с учетом локали

Для корректной работы с буквами, отличными от ASCII, необходимо установить соответствующую локаль.

// Работа с немецкими умлаутами
setlocale(LC_CTYPE, 'de_DE.UTF-8');
$result1 = ctype_lower('äöü');

// Работа с кириллицей
setlocale(LC_CTYPE, 'ru_RU.UTF-8');
$result2 = ctype_lower('абв');

var_dump($result1, $result2);
bool(true)
bool(true)
Сравнение производительности с регулярными выражениями

Для больших объемов ASCII-данных ctype_lower() работает быстрее.

$testString = str_repeat('abcdefghij', 100); // 1000 строчных символов

$time1 = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    ctype_lower($testString);
}
$timeCtype = microtime(true) - $time1;

$time2 = microtime(true);
for ($i = 0; $i < 10000; $i++) {
    preg_match('/^[a-z]+$/', $testString);
}
$timePreg = microtime(true) - $time2;

echo "Ctype: $timeCtype сек.\n";
echo "Preg_match: $timePreg сек.\n";
Ctype: 0.015 сек.
Preg_match: 0.045 сек.
Аналоги в других языках
Python

Метод строки str.islower(). Работает с Unicode и возвращает False, если строка пуста или не содержит символы, способные к изменению регистра.

print('abc'.islower())  # True
print('Abc'.islower())  # False
print('привет'.islower()) # True (для Unicode)
True
False
True
JavaScript

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

console.log(/^[a-z]+$/.test('abc')); // true
console.log('abc' === 'abc'.toLowerCase()); // true
// Для Unicode (кириллица) потребуется более сложное регулярное выражение.
true
true
MySQL

Оператор REGEXP или функция BINARY для точного сравнения с учетом регистра.

SELECT 'abc' REGEXP '^[a-z]+$'; -- 1 (true)
SELECT BINARY 'abc' = LOWER('abc'); -- 1 (true)
1
1

PHP ctype_lower function comments

En
Ctype lower Check for lowercase character(s)