1

Strncasecmp: примеры (PHP)

Сравнение первых N символов строк без учёта регистра: strncasecmp
Раздел: Работа со строками
strncasecmp(string string1, string string2, int length): int

Основные сведения о strncasecmp

Что такое 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 символов строк с учётом регистра. Применяется, когда регистр важен.

Позволяет сравнивать части строк с различными опциями, включая сравнение без учёта регистра. Более гибкая, но и более сложная в использовании.

strpos и stripos

Проверяют наличие подстроки в строке. Лучше подходят для поиска, а не для сравнения.

Типичные ошибки

Неправильная интерпретация возвращаемого значения
<?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
<?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
<?php
// Внимание! strncasecmp не поддерживает UTF-8 напрямую
$result1 = strncasecmp("Привет", "приВЕТ", 6);
$result2 = strncasecmp(mb_strtolower("Привет"), 
                       mb_strtolower("приВЕТ"), 6);

echo "Без преобразования: " . $result1 . "\n";
echo "С преобразованием: " . $result2;
?>
Без преобразования: -1
С преобразованием: 0
Использование в сортировке
Пример php
<?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
<?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()))  # True
True
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);  -- 1
0
1

PHP strncasecmp function comments

En
Strncasecmp Binary safe case-insensitive string comparison of the first n characters