Strncasecmp: примеры (PHP)
strncasecmp(string string1, string string2, int length): intОсновные сведения о strncasecmp
Функция strncasecmp в PHP выполняет бинарно-безопасное сравнение первых N символов двух строк без учёта регистра. Эта функция полезна, когда требуется сравнить только начало строк или когда нужно ограничить длину сравниваемых данных.
Функция применяется для сравнения префиксов строк, валидации ввода с определённым началом, обработки команд или ключей, где важен только начальный сегмент. Она часто используется в парсерах, роутерах или при сравнении хэшей.
string $string1 — первая сравниваемая строка.
string $string2 — вторая сравниваемая строка.
int $length — максимальное количество символов для сравнения от начала каждой строки.
Функция возвращает целое число:
• 0, если первые length символов строк идентичны (без учёта регистра).
• < 0, если string1 меньше string2.
• > 0, если string1 больше string2.
Простые примеры использования
<?php
$result = strncasecmp("Hello", "hello", 5);
echo $result;
?>0
<?php
$var1 = "Apple";
$var2 = "apricot";
echo strncasecmp($var1, $var2, 2) . "\n"; // Сравниваем "Ap" и "ap"
echo strncasecmp($var1, $var2, 3); // Сравниваем "App" и "apr"
?>0 -1
<?php
// Сравниваем только первые 3 символа
echo strncasecmp("ABCDEF", "abcXYZ", 3) . "\n";
echo strncasecmp("ABCDEF", "abcXYZ", 6);
?>0 -1
Похожие функции в PHP
Сравнивает строки целиком без учёта регистра. Используется, когда нужно сравнить строки полностью, а не только префикс.
Сравнивает первые N символов строк с учётом регистра. Применяется, когда регистр важен.
Позволяет сравнивать части строк с различными опциями, включая сравнение без учёта регистра. Более гибкая, но и более сложная в использовании.
Проверяют наличие подстроки в строке. Лучше подходят для поиска, а не для сравнения.
Типичные ошибки
<?php
// ОШИБКА: Прямое использование в условиях
if (strncasecmp("test", "TEST", 4)) {
echo "Строки не равны"; // Этот код не выполнится
} else {
echo "Строки равны"; // Выведется это
}
?>Строки равны
<?php
// Функция ожидает строки
$result = strncasecmp(12345, "12345", 3);
var_dump($result);
?>int(0)
<?php
// Если length больше длины строк, сравнение продолжается до конца строк
$result = strncasecmp("short", "SHORTSTRING", 10);
echo $result;
?>0
Изменения в версиях PHP
В PHP 8.0.0 функция стала строго типизированной. Аргументы, которые не являются строками, теперь приводятся к строкам с генерацией предупреждения. В более ранних версиях нестроковые аргументы преобразовывались без предупреждений.
<?php
// В PHP 8
strncasecmp([], "test", 2);
?>Warning: strncasecmp() expects parameter 1 to be string, array given
Расширенные примеры
<?php
function checkCommand($input) {
$commands = ["START", "STOP", "PAUSE"];
foreach ($commands as $cmd) {
if (strncasecmp($input, $cmd, strlen($cmd)) === 0) {
return "Команда '" . $cmd . "' распознана";
}
}
return "Неизвестная команда";
}
echo checkCommand("staRT processing") . "\n";
echo checkCommand("sto") . "\n";
echo checkCommand("continue");
?>Команда 'START' распознана Команда 'STOP' распознана Неизвестная команда
<?php
// Внимание! strncasecmp не поддерживает UTF-8 напрямую
$result1 = strncasecmp("Привет", "приВЕТ", 6);
$result2 = strncasecmp(mb_strtolower("Привет"),
mb_strtolower("приВЕТ"), 6);
echo "Без преобразования: " . $result1 . "\n";
echo "С преобразованием: " . $result2;
?>Без преобразования: -1 С преобразованием: 0
<?php
$words = ["Apple", "apricot", "Banana", "berry", "Apricot"];
usort($words, function($a, $b) {
return strncasecmp($a, $b, 2); // Сортировка по первым двум буквам
});
print_r($words);
?>Array
(
[0] => Apple
[1] => apricot
[2] => Apricot
[3] => Banana
[4] => berry
)<?php
function isValidId($id) {
$prefixes = ["USR", "GRP", "DEV"];
foreach ($prefixes as $prefix) {
if (strncasecmp($id, $prefix, 3) === 0) {
return true;
}
}
return false;
}
var_dump(isValidId("usr_12345"));
var_dump(isValidId("ADM_001"));
?>bool(true) bool(false)
Аналоги в других языках
Strncasecmp в Python
# Использование среза и lower
str1 = "Hello"
str2 = "HELLO world"
result = str1[:3].lower() == str2[:3].lower()
print(result) # True
# Использование str.startswith (только проверка равенства)
print(str2.lower().startswith(str1[:3].lower())) # TrueTrue True
Strncasecmp в Javascript
// Использование substring и toLowerCase
let str1 = "Hello";
let str2 = "HELLO world";
let result = str1.substring(0, 3).toLowerCase() ===
str2.substring(0, 3).toLowerCase();
console.log(result); // true
// Локальное сравнение
console.log(str1.localeCompare(str2, undefined,
{ sensitivity: 'accent', usage: 'search' }));true 0
Strncasecmp в MySQL
-- Использование LEFT и сравнения
SELECT LEFT('Hello', 3) = LEFT('HELLO world', 3); -- 0 (с учётом регистра)
-- Без учёта регистра через COLLATE
SELECT LEFT('Hello', 3) COLLATE utf8mb4_general_ci =
LEFT('HELLO world', 3); -- 10 1