W3docs

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.

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

Базовый пример

php— editable, runs on the server

Здесь $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(), когда регистр важен.

Практика

Практика
Что делает функция strcasecmp() в PHP?
Что делает функция strcasecmp() в PHP?
Was this page helpful?