Strcasecmp: примеры (PHP)
strcasecmp(string string1, string string2): intstrcasecmp — это встроенная функция PHP для бинарно-безопасного сравнения строк без учёта регистра символов. Функция используется, когда необходимо определить лексикографическую разницу между двумя строками, игнорируя различия между заглавными и строчными буквами. Это полезно для сравнения пользовательского ввода, имён файлов или ключей в массивах, где регистр не важен.
int strcasecmp(string $string1, string $string2)
Функция принимает два обязательных строковых аргумента:
- string1 — первая сравниваемая строка.
- string2 — вторая сравниваемая строка.
Возвращаемое значение: целое число меньше 0, если string1 меньше string2; больше 0, если string1 больше string2; и 0, если строки равны без учёта регистра.
echo strcasecmp("Hello", "hello");0
echo strcasecmp("Apple", "Banana");-1
echo strcasecmp("Banana", "Apple");1
echo strcasecmp("", "test");
echo strcasecmp("test", "");-1 1
В PHP существует ряд функций для сравнения строк, каждая со своими особенностями:
- strcmp() — бинарно-безопасное сравнение строк с учётом регистра. Используется, когда регистр символов важен.
- strncasecmp() — сравнение без учёта регистра, но только первых N байт строк. Полезно для сравнения начала строк.
- strnatcasecmp() — «естественное» сравнение без учёта регистра (например, «img2» перед «img12»). Подходит для сортировки строк, содержащих числа.
- substr_compare() — сравнение частей строк с опцией игнорирования регистра. Используется для сравнения строк с определённого смещения.
- === (оператор идентичности) — строгое сравнение, проверяет идентичность строк, включая регистр и тип.
strcasecmp()предпочтительнее, когда нужен только результат сравнения (больше, меньше, равно) без учёта регистра.
Функция возвращает целое число, а не true/false. Ошибкой является прямое использование результата в условиях как булева значения без сравнения с нулём.
// Неправильно
if (strcasecmp($str1, $str2)) {
echo 'Строки не равны';
}
// Правильно
if (strcasecmp($str1, $str2) !== 0) {
echo 'Строки не равны';
}strcasecmp() не учитывает многобайтовые кодировки (например, UTF-8) корректно для не-ASCII символов. Для строк в UTF-8 следует использовать mb_strtolower() перед сравнением или mb_strcasecmp() из расширения mbstring.
echo strcasecmp('Привет', 'привет'); // Может работать некорректноМожет вернуть ненулевое значение в зависимости от окружения
До PHP 7.0.0 функция strcasecmp() могла не быть бинарно безопасной на некоторых системах. Начиная с PHP 7.0.0, функция всегда бинарно безопасна. В PHP 8.0.0 функция теперь выбрасывает ошибку типа TypeError, если переданы аргументы нестрокового типа, в то время как ранее она возвращала 0 или 1 (или даже NULL) и могла вызывать предупреждение E_WARNING.
$fruits = ["Orange", "apple", "Banana", "GRAPE"];
usort($fruits, function($a, $b) {
return strcasecmp($a, $b);
});
print_r($fruits);Array
(
[0] => apple
[1] => Banana
[2] => GRAPE
[3] => Orange
)$data = ["Name" => "John", "Age" => 25];
$keyToFind = "name";
$foundKey = array_keys(array_filter(array_keys($data), function($key) use ($keyToFind) {
return strcasecmp($key, $keyToFind) === 0;
}));
print_r($foundKey);Array
(
[0] => Name
)function caseInsensitiveInArray($needle, $haystack) {
foreach ($haystack as $value) {
if (strcasecmp($needle, $value) === 0) {
return true;
}
}
return false;
}
$array = ["Red", "Green", "Blue"];
var_dump(caseInsensitiveInArray("blue", $array));bool(true)
echo strcasecmp("file2", "file10");
echo strnatcasecmp("file2", "file10");1 -1
Strcasecmp в Python
Метод str.casefold() для агрессивного приведения к одному регистру с последующим сравнением, или str.lower(). Прямого аналога нет, обычно используют сравнение через == после приведения к нижнему регистру.
result = "Hello".casefold() == "hello".casefold()
print(result)True
Strcasecmp в Javascript
Метод localeCompare() с опцией sensitivity: 'accent' или 'base'. Также можно использовать toLowerCase() перед сравнением.
let result = 'Hello'.localeCompare('hello', undefined, { sensitivity: 'accent' });
console.log(result);0
Strcasecmp в MySQL
Операторы сравнения с учётом или без учёта регистра зависят от коллации столбца. Для сравнения без учёта регистра можно использовать функцию LOWER() или коллацию с суффиксом _ci (case-insensitive).
SELECT 'Hello' LIKE 'hello'; -- Зависит от коллации
SELECT STRCMP(LOWER('Hello'), LOWER('hello'));1 (если коллация case-sensitive) 0