strcasecmp()
Статья о PHP-функции strcasecmp(), которая сравнивает две строки без учёта регистра. Рассматриваются синтаксис и возвращаемые значения.
strcasecmp() — встроенная PHP-функция, которая сравнивает две строки без учёта регистра: "Hello" и "hello" считаются равными. Функция выполняет двоично-безопасное сравнение и возвращает число, которое указывает не только различаются ли строки, но и какая из них «больше» в порядке байтов. На этой странице рассмотрены синтаксис, значение возвращаемого результата, практические примеры, распространённые ошибки и отличия от похожих функций.
Синтаксис
strcasecmp(string $string1, string $string2): intФункция принимает два обязательных параметра:
$string1— первая строка для сравнения.$string2— вторая строка для сравнения.
Возвращаемое значение
Именно здесь многие допускают ошибку. strcasecmp() не возвращает true/false. Она возвращает целое число:
0— если строки равны (без учёта регистра).- Значение меньше 0 — если
$string1«меньше»$string2. - Значение больше 0 — если
$string1«больше»$string2.
Сравнение основано на байтовых значениях символов (приведённых к нижнему регистру), поэтому результат также даёт алфавитный порядок, что делает функцию удобной для функций сортировки.
Базовый пример
Здесь $string1 и $string2 отличаются только регистром, поэтому strcasecmp() возвращает 0, и условие $result == 0 выполняется.
Результат выполнения кода:
The two strings are equal.Интерпретация знака результата
Если строки не равны, знак результата указывает на их порядок. Обратите внимание, что точное значение числа не стандартизировано в разных версиях PHP — значим только знак (отрицательный, ноль, положительный), поэтому всегда сравнивайте результат с 0.
<?php
// "apple" comes before "Banana" alphabetically (case ignored)
var_dump(strcasecmp("apple", "Banana") < 0); // bool(true)
var_dump(strcasecmp("Banana", "apple") > 0); // bool(true)
var_dump(strcasecmp("PHP", "php") === 0); // bool(true)
?>Вывод:
bool(true)
bool(true)
bool(true)Практический пример: проверка логина без учёта регистра
Распространённый случай использования — сравнение пользовательского ввода, где регистр не важен, например, имя пользователя или ответ «да/нет».
<?php
$input = "ADMIN";
if (strcasecmp($input, "admin") === 0) {
echo "Welcome, admin!";
} else {
echo "Access denied.";
}
?>Вывод:
Welcome, admin!Использование в качестве функции сортировки
Поскольку strcasecmp() возвращает упорядочивающее целое число, она является естественным колбэком для usort() при алфавитной сортировке строк без учёта регистра.
<?php
$names = ["banana", "Apple", "cherry", "apple"];
usort($names, "strcasecmp");
print_r($names);
?>Вывод:
Array
(
[0] => Apple
[1] => apple
[2] => banana
[3] => cherry
)Распространённые ошибки
- Функция возвращает целое число, а не boolean. Запись
if (strcasecmp($a, $b))является ошибкой: блок выполняется, когда строки различаются (ненулевое значение), и пропускается, когда они равны (0). Всегда сравнивайте явно с=== 0. - Функция работает на уровне байтов, а не поддерживает Unicode.
strcasecmp()приводит к нижнему регистру только ASCII-буквыA–Z. Символы с диакритиками и многобайтовые символы (например,Éиé) не считаются равными. Для многобайтового сравнения с учётом локали нормализуйте обе строки предварительно или используйте расширениеintl. - Пробелы и завершающие символы имеют значение.
strcasecmp("yes", "yes ")вернёт ненулевое значение. При необходимости обрезайте ввод с помощьюtrim().
Похожие функции
strcmp()— аналог с учётом регистра; та же семантика возвращаемого значения.strncasecmp()— сравнение без учёта регистра только первых n символов.strtolower()— приводит строку к нижнему регистру, полезно перед ручным сравнением.
Итог
strcasecmp() сравнивает две строки без учёта регистра и возвращает 0 при совпадении, отрицательное число — если первая строка меньше, и положительное — если больше. Помните: нужно проверять результат относительно 0, а не использовать его как boolean. Применяйте strcmp(), когда регистр важен.