Ctype lower: примеры (PHP)
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)
- ctype_upper() – проверяет наличие только заглавных букв. Прямая противоположность ctype_lower().
- preg_match() с регулярным выражением, например,
/^[a-z]+$/или/^\\p{Ll}+$/uдля Unicode. Используется для более сложных паттернов и поддержки Unicode без зависимости от локали. - strtolower() == $string – сравнение исходной строки с ее версией в нижнем регистре. Учитывает локаль, но требует полного преобразования строки, что может быть менее эффективно, чем посимвольная проверка ctype_lower().
ctype_lower() предпочтительна для простых ASCII-строк, где важна скорость. Для проверки строк в Unicode (кириллица, другие алфавиты) надежнее использовать preg_match() с модификатором /u.
// До PHP 8.1.0 $result = ctype_lower(97); // 97 - код ASCII для 'a' var_dump($result);
bool(true) // Неочевидное поведение
setlocale(LC_CTYPE, 'C'); // Локаль по умолчанию
$result = ctype_lower('абв');
var_dump($result);bool(false) // Кириллица не воспринимается как буквы
Разработчики иногда забывают, что пустая строка возвращает false, что может нарушить логику проверки.
$input = '';
if (ctype_lower($input)) {
echo 'Строка в нижнем регистре';
} else {
echo 'Не в нижнем регистре или пуста';
}Не в нижнем регистре или пуста
- 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 сек.
Метод строки str.islower(). Работает с Unicode и возвращает False, если строка пуста или не содержит символы, способные к изменению регистра.
print('abc'.islower()) # True
print('Abc'.islower()) # False
print('привет'.islower()) # True (для Unicode)True False True
Прямого аналога нет. Можно использовать регулярное выражение или сравнить строку с ее версией в нижнем регистре.
console.log(/^[a-z]+$/.test('abc')); // true
console.log('abc' === 'abc'.toLowerCase()); // true
// Для Unicode (кириллица) потребуется более сложное регулярное выражение.true true
Оператор REGEXP или функция BINARY для точного сравнения с учетом регистра.
SELECT 'abc' REGEXP '^[a-z]+$'; -- 1 (true)
SELECT BINARY 'abc' = LOWER('abc'); -- 1 (true)1 1