substr_compare()
La funzione substr_compare() in PHP confronta due stringhe a partire da una posizione specificata fino a una lunghezza definita.
Introduzione
La funzione substr_compare() confronta una porzione di una stringa con un'altra stringa, partendo da un determinato offset. Funziona come confrontare una sottostringa di $main_str con $str — ma senza dover chiamare prima substr() per estrarre la sottostringa. Questo la rende il modo idiomatico e senza allocazioni per rispondere a domande come "questa stringa inizia con X?" o "questa stringa finisce con Y?" nelle versioni più vecchie di PHP.
Questo capitolo spiega i parametri, il significato del valore restituito e i pattern comuni (controllo del prefisso, controllo del suffisso, confronto case-insensitive) in cui substr_compare() eccelle.
Sintassi
substr_compare(
string $haystack,
string $needle,
int $offset,
?int $length = null,
bool $case_insensitive = false
): intNota: Il parametro
$lengthè opzionale. In PHP 8+ è esplicitamente tipizzato come nullable (?int); passarenull(o ometterlo) confronta fino alla fine di$haystack.
| Parametro | Descrizione |
|---|---|
$haystack | La stringa principale. Il confronto legge una porzione di questa stringa. |
$needle | La stringa confrontata con la porzione di $haystack. |
$offset | Il punto in $haystack da cui inizia il confronto. Un valore negativo conta a partire dalla fine di $haystack. |
$length | Il numero di caratteri da confrontare. Se null, viene utilizzato il maggiore tra i caratteri rimanenti di $haystack e l'intera $needle. |
$case_insensitive | Se true, le maiuscole vengono ignorate ("A" equivale a "a"). Il valore predefinito è false. |
Valore restituito
substr_compare() restituisce un int:
0— le porzioni confrontate sono uguali.- un numero negativo — la porzione di
$haystackè minore di$needle(viene prima nell'ordinamento). - un numero positivo — la porzione di
$haystackè maggiore di$needle(viene dopo nell'ordinamento).
Ciò che conta è il segno; la grandezza esatta è definita dall'implementazione e non deve essere considerata affidabile. Per verificare l'uguaglianza, confronta esplicitamente con 0: substr_compare(...) === 0.
Esempio di base
Qui confrontiamo i primi strlen($string2) (6) caratteri di "Hello World!" con "Hello!". Il sesto carattere è uno spazio (" ") nella prima stringa ma un punto esclamativo ("!") nella seconda; uno spazio (ASCII 32) viene prima di ! (ASCII 33), quindi la funzione restituisce un intero negativo (-1).
Verificare se una stringa inizia con un prefisso
Confrontare all'offset 0 con $length uguale alla lunghezza del prefisso è un modo efficace per testare se una stringa "inizia con" qualcosa:
<?php
function startsWith(string $haystack, string $prefix): bool
{
return substr_compare($haystack, $prefix, 0, strlen($prefix)) === 0;
}
var_dump(startsWith("php-fpm", "php")); // bool(true)
var_dump(startsWith("python", "php")); // bool(false)Su PHP 8.0+ puoi usare la funzione built-in
str_starts_with()al suo posto.substr_compare()rimane utile su runtime più vecchi e quando hai bisogno anche della case-insensitivity.
Verificare se una stringa termina con un suffisso
Un offset negativo conta dalla fine della stringa, il che rende semplice il controllo del suffisso — non è necessario calcolare la posizione manualmente:
<?php
function endsWith(string $haystack, string $suffix): bool
{
return substr_compare($haystack, $suffix, -strlen($suffix)) === 0;
}
var_dump(endsWith("report.pdf", ".pdf")); // bool(true)
var_dump(endsWith("report.txt", ".pdf")); // bool(false)Confronto case-insensitive
Imposta il quinto argomento su true per ignorare le maiuscole:
<?php
$sensitive = substr_compare("Hello", "hello", 0);
$insensitive = substr_compare("Hello", "hello", 0, null, true);
echo $sensitive; // non-zero: 'H' and 'h' differ
echo PHP_EOL;
echo $insensitive; // 0: equal when case is ignoredAvvertenze
- Offset fuori intervallo. Un
$offsetpositivo maggiore della lunghezza di$haystackgenera unValueErrorin PHP 8+ (un avviso che restituiscefalsein PHP 7). Valida gli offset rispetto astrlen($haystack)quando provengono da input utente. $lengthmaggiore di quanto rimane. Se$lengthsupera i caratteri disponibili, vengono confrontati solo i caratteri disponibili — la funzione non genera errori, confronta semplicemente meno.- Basato sui byte, non multibyte-aware.
substr_compare()opera sui byte. Per testo UTF-8 dove un carattere può occupare più byte, gli offset e le lunghezze sono offset di byte, non di caratteri.
Funzioni correlate
strcmp()— confronto binary-safe di due stringhe intere.strncmp()— confronta solo i primi n caratteri di due stringhe.strcasecmp()— confronto case-insensitive di due stringhe intere.substr()— estrae una porzione di una stringa.
Conclusione
substr_compare() confronta una porzione di una stringa con un'altra senza estrarla prima, il che la rende efficiente per i controlli di prefisso e suffisso. Ricorda di confrontare il risultato con 0 per verificare l'uguaglianza, usa un $offset negativo per i test "finisce con" e passa true come ultimo argomento quando le maiuscole devono essere ignorate.