strncmp()
La funzione strncmp() in PHP confronta i primi N caratteri di due stringhe con distinzione tra maiuscole e minuscole.
Introduzione
La funzione strncmp() in PHP esegue un confronto binary-safe, con distinzione tra maiuscole e minuscole dei primi N caratteri di due stringhe. Invece di confrontare le stringhe per intero, esamina soltanto la porzione iniziale specificata — il che la rende lo strumento giusto quando interessa un prefisso piuttosto che l'intero valore (ad esempio, verificare se un URL inizia con https, oppure raggruppare codici che condividono un'intestazione comune).
Questo articolo tratta la sintassi di strncmp(), come interpretare il valore restituito, diversi esempi pratici e le insidie più comuni.
Sintassi
strncmp(string $string1, string $string2, int $length): int| Parametro | Descrizione |
|---|---|
$string1 | La prima stringa da confrontare. |
$string2 | La seconda stringa da confrontare. |
$length | Il numero massimo di caratteri da confrontare dall'inizio di ciascuna stringa. |
strncmp() confronta byte per byte i primi $length caratteri di $string1 e $string2 e restituisce un intero:
| Valore restituito | Significato |
|---|---|
< 0 (negativo) | $string1 è "minore di" $string2 nell'intervallo confrontato. |
0 | I primi $length caratteri sono uguali. |
> 0 (positivo) | $string1 è "maggiore di" $string2 nell'intervallo confrontato. |
Il confronto è lessicografico, basato sul valore byte di ciascun carattere. Poiché le lettere ASCII maiuscole (A–Z, codici 65–90) precedono quelle minuscole (a–z, codici 97–122), "Apple" è considerata minore di "apple". Il numero non nullo esatto è la differenza del valore byte tra il primo carattere diverso, ma ci si dovrebbe affidare solo al suo segno, non alla sua entità.
Esempio: confronto di un prefisso
<?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";
}Anche se "Hello World" e "Hello" differiscono nel complesso, i loro primi 5 caratteri ("Hello") sono identici, quindi strncmp() restituisce 0 e l'output è:
The first 5 characters of Hello World are equal to the first 5 characters of HelloEsempio: verificare se una stringa inizia con un prefisso
Un utilizzo classico di strncmp() è il controllo di un prefisso. Passando la lunghezza del prefisso come $length, si confronta solo la parte della stringa soggetto coperta dal prefisso:
<?php
$url = "https://www.w3docs.com";
if (strncmp($url, "https", 5) === 0) {
echo "Secure URL";
} else {
echo "Not secure";
}Questo stampa Secure URL. Su PHP 8.0+ la funzione dedicata str_starts_with() esprime lo stesso intento in modo più chiaro, ma strncmp() rimane la scelta portabile per le versioni precedenti.
Esempio: distinzione tra maiuscole e minuscole
strncmp() distingue le lettere maiuscole da quelle minuscole:
<?php
echo strncmp("PHP", "php", 3); // negative: 'P' (80) < 'p' (112)Se occorre ignorare le differenze di maiuscolo/minuscolo, usare strncasecmp(), che esegue lo stesso confronto limitato in lunghezza senza distinzione tra maiuscole e minuscole.
Insidie comuni
- Solo il segno è significativo. Trattare il risultato come "negativo / zero / positivo" e preferire
=== 0quando si vuole dire "i prefissi corrispondono". Non si deve assumere che il valore sia esattamente-1,0o1— può essere qualsiasi intero. $lengthmaggiore della lunghezza delle stringhe è accettabile. Se$lengthsupera la lunghezza di una delle stringhe,strncmp()confronta semplicemente fino alla fine della stringa più corta.strncmp("Hi", "Hi", 50)restituisce0.- Un
$lengthnegativo genera unValueErrorsu PHP 8.0+ (e veniva trattato come0nelle versioni precedenti). - È basata sui byte, non consapevole del multibyte. Per il testo UTF-8,
$lengthconta i byte, non i caratteri, quindi un carattere multibyte potrebbe essere spezzato. I dati ASCII semplici non sono interessati.
Funzioni correlate
strcmp()— confronta due stringhe complete, con distinzione tra maiuscole e minuscole.strncasecmp()— comestrncmp(), ma senza distinzione tra maiuscole e minuscole.strcasecmp()— confronto senza distinzione tra maiuscole e minuscole di stringhe complete.substr_compare()— confronta stringhe a partire da un offset scelto.strpos()— trova la posizione di una sottostringa.
Conclusione
strncmp() confronta solo i primi N caratteri di due stringhe, con distinzione tra maiuscole e minuscole e in modo binary-safe, restituendo un numero negativo, 0 o un numero positivo. Usarla quando è necessario verificare un prefisso o confrontare una porzione iniziale di lunghezza fissa di due stringhe — e ricordare di controllare il segno del risultato con === 0, < 0 o > 0 piuttosto che un valore esatto.