strncasecmp()
A função strncasecmp() do PHP compara os primeiros N caracteres de duas strings ignorando maiúsculas e minúsculas. Veja sintaxe, retorno e exemplos.
Introdução
strncasecmp() compara os primeiros N caracteres de duas strings ignorando a diferença entre maiúsculas e minúsculas. Ela é o membro limitado e sem distinção de caixa da família de funções de comparação de strings do PHP:
- Ela ignora a caixa das letras, como
strcasecmp()—Aeasão tratados como iguais. - Ela examina apenas os primeiros
$lengthcaracteres, comostrncmp()— o restante de cada string é ignorado.
Em resumo: strncasecmp() está para strncmp() assim como strcasecmp() está para strcmp() — o mesmo trabalho, mas com a diferença de caixa eliminada antes da comparação. Esta página aborda a sintaxe, o que o valor de retorno realmente significa, vários exemplos executáveis e as armadilhas que costumam pegar as pessoas no código real.
Sintaxe
strncasecmp(string $string1, string $string2, int $length): int| Parâmetro | Descrição |
|---|---|
$string1 | A primeira string a comparar. |
$string2 | A segunda string a comparar. |
$length | O número máximo de caracteres (bytes) a comparar em cada string. |
A função retorna um inteiro, não um boolean — esta é a fonte mais comum de bugs (veja Gotchas).
O que significa o valor de retorno
O valor de retorno indica uma direção, não um verdadeiro/falso:
| Valor de retorno | Significado |
|---|---|
< 0 (negativo) | $string1 vem antes de $string2 na ordenação (dentro dos primeiros $length caracteres). |
0 | Os primeiros $length caracteres são iguais, ignorando a caixa. |
> 0 (positivo) | $string1 vem depois de $string2 na ordenação (dentro dos primeiros $length caracteres). |
Apenas o sinal é garantido por contrato. Não confie na magnitude exata (versões mais antigas do PHP retornavam a diferença entre os primeiros bytes divergentes; o PHP 8 pode retornar -1/0/1). Teste sempre com < 0, === 0 ou > 0.
Exemplo básico
<?php
$string1 = "Hello World";
$string2 = "hello world";
$length = 5;
$result = strncasecmp($string1, $string2, $length);
if ($result < 0) {
echo "The first $length characters of $string1 are less than those of $string2";
} elseif ($result > 0) {
echo "The first $length characters of $string1 are greater than those of $string2";
} else {
echo "The first $length characters of $string1 are equal to those of $string2";
}Os cinco primeiros caracteres são Hello e hello. Como a comparação ignora a caixa, eles são iguais, portanto a saída é:
The first 5 characters of Hello World are equal to those of hello worldComo $length altera o resultado
Somente os primeiros $length caracteres são inspecionados; tudo o que vem depois desse índice é invisível para a comparação. Isso torna strncasecmp() ideal para a correspondência de prefixos.
<?php
// "image/png" vs "IMAGE/JPEG"
var_dump(strncasecmp("image/png", "IMAGE/JPEG", 6) === 0); // compares "image/" — true
var_dump(strncasecmp("image/png", "IMAGE/JPEG", 9) === 0); // now "png" vs "JPE" differs — falseSaída:
bool(true)
bool(false)Com um comprimento de 6, as duas strings compartilham o prefixo image/ (sem distinção de caixa), portanto são iguais. Ao ampliar a janela para 9, os sufixos diferentes (png e jpe) as tornam desiguais.
Uso prático: verificação de prefixo sem distinção de caixa
Uma necessidade comum no mundo real é saber se "esta string começa com X, independentemente da caixa?" — por exemplo, ao detectar o esquema de uma URL.
<?php
function startsWithIgnoreCase(string $haystack, string $prefix): bool
{
return strncasecmp($haystack, $prefix, strlen($prefix)) === 0;
}
var_dump(startsWithIgnoreCase("HTTPS://w3docs.com", "https://")); // true
var_dump(startsWithIgnoreCase("ftp://files.example", "https://")); // falseSaída:
bool(true)
bool(false)Passar strlen($prefix) como comprimento significa comparar exatamente o prefixo e nada além dele. No PHP 8 você também poderia usar str_starts_with(), mas ela diferencia maiúsculas de minúsculas — strncasecmp() continua sendo a escolha idiomática quando a caixa deve ser ignorada.
Gotchas
- Ela retorna um
int, nunca umbool. Escreverif (strncasecmp($a, $b, 3))entra no bloco quando as strings diferem (um valor diferente de zero é truthy) e o ignora quando elas são iguais (0é falsy) — o oposto do que a maioria das pessoas pretende. Compare sempre de forma explícita:if (strncasecmp($a, $b, 3) === 0). - Ela trabalha com bytes e não reconhece multibyte.
$lengthconta bytes, e a normalização de caixa só funciona para ASCII (A–Z). Para texto acentuado ou não latino, use antesmb_strtolower()nos dois operandos, ou funções de comparaçãomb_*. - Um
$lengthmaior que qualquer uma das strings não é problema. A comparação simplesmente termina no fim da string mais curta; não há leitura fora dos limites. - Strings vazias são iguais para qualquer comprimento.
strncasecmp("", "", 5)retorna0.
Funções relacionadas
strncmp()— a mesma comparação limitada, mas sensível a maiúsculas e minúsculas.strcasecmp()— comparação sem distinção de caixa da string inteira.strcmp()— comparação sensível a maiúsculas e minúsculas da string inteira.substr_compare()— compara a partir de um deslocamento arbitrário, com um sinalizador opcional para ignorar a caixa.strpos()— encontra a posição em que uma string ocorre dentro de outra.
Conclusão
strncasecmp() compara os primeiros $length caracteres de duas strings ignorando a caixa, retornando um número negativo, 0 ou um número positivo para indicar a ordem de classificação. Use-a quando precisar de uma correspondência de prefixo sem distinção de caixa ou quiser comparar apenas a parte inicial de duas strings. Lembre-se de que o resultado é um inteiro — teste sempre o sinal de forma explícita — e de que ela opera sobre bytes, portanto recorra às funções mb_* ao lidar com texto multibyte.