strncmp()
La función strncmp() en PHP compara los primeros N caracteres de dos cadenas de forma binaria y sensible a mayúsculas.
Introducción
La función strncmp() en PHP realiza una comparación binaria segura y sensible a mayúsculas de los primeros N caracteres de dos cadenas. En lugar de comparar las cadenas en su totalidad, solo examina la porción inicial que se especifica, lo que la convierte en la herramienta adecuada cuando se necesita comparar un prefijo en lugar del valor completo (por ejemplo, verificar si una URL comienza con https o agrupar códigos que comparten un encabezado común).
Este artículo cubre la sintaxis de strncmp(), cómo interpretar su valor de retorno, varios ejemplos prácticos y los errores comunes que suelen cometerse.
Sintaxis
strncmp(string $string1, string $string2, int $length): int| Parámetro | Descripción |
|---|---|
$string1 | La primera cadena a comparar. |
$string2 | La segunda cadena a comparar. |
$length | El número máximo de caracteres a comparar desde el inicio de cada cadena. |
strncmp() compara los primeros $length caracteres de $string1 y $string2 byte a byte y devuelve un entero:
| Valor de retorno | Significado |
|---|---|
< 0 (negativo) | $string1 es "menor que" $string2 dentro del rango comparado. |
0 | Los primeros $length caracteres son iguales. |
> 0 (positivo) | $string1 es "mayor que" $string2 dentro del rango comparado. |
La comparación es lexicográfica, basada en el valor de byte de cada carácter. Dado que las letras ASCII en mayúsculas (A–Z, códigos 65–90) van antes que las minúsculas (a–z, códigos 97–122), "Apple" se considera menor que "apple". El número no nulo exacto es la diferencia de valor de byte del primer carácter diferente, pero solo se debe confiar en su signo, no en su magnitud.
Ejemplo: comparar un prefijo
<?php
$string1 = "Hello World";
$string2 = "Hello";
$length = 5;
$result = strncmp($string1, $string2, $length);
if ($result < 0) {
echo "The first $length characters of $string1 are less than the first $length characters of $string2";
} elseif ($result > 0) {
echo "The first $length characters of $string1 are greater than the first $length characters of $string2";
} else {
echo "The first $length characters of $string1 are equal to the first $length characters of $string2";
}Aunque "Hello World" y "Hello" difieren en general, sus primeros 5 caracteres ("Hello") son idénticos, por lo que strncmp() devuelve 0 y la salida es:
The first 5 characters of Hello World are equal to the first 5 characters of HelloEjemplo: verificar si una cadena comienza con un prefijo
Un uso clásico de strncmp() es comprobar la presencia de un prefijo. Al pasar la longitud del prefijo como $length, solo se compara la parte del sujeto que cubre el prefijo:
<?php
$url = "https://www.w3docs.com";
if (strncmp($url, "https", 5) === 0) {
echo "Secure URL";
} else {
echo "Not secure";
}Esto imprime Secure URL. En PHP 8.0+ la función dedicada str_starts_with() expresa la misma intención de forma más clara, pero strncmp() sigue siendo la opción portable para versiones anteriores.
Ejemplo: distinción entre mayúsculas y minúsculas
strncmp() distingue entre mayúsculas y minúsculas:
<?php
echo strncmp("PHP", "php", 3); // negative: 'P' (80) < 'p' (112)Si necesitas ignorar las mayúsculas, usa strncasecmp() en su lugar, que realiza la misma comparación limitada por longitud sin distinguir entre mayúsculas y minúsculas.
Errores comunes
- Solo el signo es significativo. Trata el resultado como "negativo / cero / positivo" y prefiere
=== 0cuando quieres decir "los prefijos coinciden". No asumas que el valor es exactamente-1,0o1; puede ser cualquier entero. $lengthmayor que las cadenas no es un problema. Si$lengthsupera la longitud de alguna de las cadenas,strncmp()simplemente compara hasta el final de la más corta.strncmp("Hi", "Hi", 50)devuelve0.- Un
$lengthnegativo lanza unValueErroren PHP 8.0+ (y en versiones anteriores se trataba como0). - Está basado en bytes, no en multibyte. Para texto UTF-8,
$lengthcuenta bytes, no caracteres, por lo que un carácter multibyte puede dividirse. Los datos ASCII simples no se ven afectados.
Funciones relacionadas
strcmp()— compara dos cadenas completas, con distinción de mayúsculas.strncasecmp()— comostrncmp(), pero sin distinción de mayúsculas.strcasecmp()— comparación sin distinción de mayúsculas de cadenas completas.substr_compare()— compara cadenas a partir de un desplazamiento elegido.strpos()— encuentra la posición de una subcadena.
Conclusión
strncmp() compara solo los primeros N caracteres de dos cadenas, con distinción de mayúsculas y de forma binaria segura, devolviendo un número negativo, 0 o un número positivo. Úsala cuando necesites hacer coincidir un prefijo o comparar una porción inicial de longitud fija de dos cadenas, y recuerda verificar el signo del resultado con === 0, < 0 o > 0 en lugar de un valor exacto.