strrpos()
La funzione strrpos() in PHP trova l'ultima occorrenza di una sottostringa in una stringa, restituendone la posizione come indice a base zero.
Introduzione
La funzione strrpos() trova l'ultima occorrenza di una sottostringa all'interno di una stringa e restituisce la sua posizione a base zero (l'indice del primo carattere). Pensatela come il riflesso speculare di strpos(), che trova la prima occorrenza: strpos() scansiona da sinistra a destra, mentre strrpos() riporta la corrispondenza più a destra.
Si ricorre a strrpos() ogni volta che interessa la parte finale di una stringa — ad esempio per ottenere l'estensione di un file dopo l'ultimo punto, dividere un percorso sull'ultimo slash, o troncare tutto ciò che segue l'ultimo separatore.
Questa pagina illustra la sintassi, la facile insidia false/0, come il parametro $offset (inclusi i valori negativi) restringe la ricerca e il fratello case-insensitive strripos().
Sintassi
strrpos(string $haystack, string $needle, int $offset = 0): int|false| Parametro | Descrizione |
|---|---|
$haystack | La stringa in cui cercare. |
$needle | La sottostringa da cercare. |
$offset | Opzionale. Cambia il punto di inizio/fine della ricerca. Un offset positivo avvia la ricerca a quel numero di caratteri dall'inizio; un offset negativo termina la ricerca a quel numero di caratteri dalla fine. |
Valore restituito: la posizione intera (contando da 0) dell'ultima corrispondenza, oppure false se $needle non compare mai in $haystack. La posizione è un offset in byte, quindi per testo multibyte (accenti UTF-8, emoji) è preferibile usare mb_strrpos().
Esempio d'uso
Ecco un esempio d'uso della funzione strrpos() in PHP:
Esempio di strrpos() in PHP
"Hello World" contiene due caratteri o — all'indice 4 e all'indice 7. Poiché strrpos() riporta l'ultimo, l'output è:
Found last occurrence of 'o' in 'Hello World' at position 7Confrontare sempre con === / !== false
Questa è l'insidia che colpisce tutti. Quando la corrispondenza si trova all'inizio della stringa, strrpos() restituisce 0, e PHP tratta 0 come valore falso. Un controllo non rigoroso come if ($result) concluderebbe erroneamente "non trovato":
<?php
// "h" is at position 0, so strrpos returns 0
$pos = strrpos("hello", "h");
if ($pos == false) { // WRONG: 0 == false is true
echo "not found"; // this prints, even though "h" WAS found
} else {
echo "found at $pos";
}La correzione consiste nell'operatore rigoroso !== false (usato nel primo esempio), che distingue l'intero 0 dal booleano false.
Restringere la ricerca con $offset
Un offset negativo è la forma più utile: indica a strrpos() di interrompere la ricerca a quel numero di caratteri prima della fine, il che è comodo per ignorare una parte finale della stringa.
<?php
$path = "a/b/c/d";
// Last slash overall:
echo strrpos($path, "/"); // 5
// Last slash, ignoring the final 2 chars ("/d"):
echo "\n";
echo strrpos($path, "/", -3); // 3Un offset positivo inizia la ricerca a quel numero di caratteri dall'inizio, saltando le corrispondenze precedenti.
Ricerca case-insensitive: strripos()
strrpos() è case-sensitive — strrpos("FOO", "o") restituisce false. Quando il maiuscolo/minuscolo non deve essere rilevante, si usa strripos(), che ha la firma identica ma corrisponde indipendentemente dal caso:
<?php
$str = "PHP is the Programming language: php";
echo strrpos($str, "php"); // 33 (only the lowercase one matches)
echo "\n";
echo strripos($str, "php"); // 33 (right-most match, ignoring case)Funzioni correlate
strpos()— posizione della prima occorrenza.stripos()— prima occorrenza, case-insensitive.substr()— estrae la parte della stringa dopo la posizione trovata.str_replace()— sostituisce le occorrenze senza averne bisogno della posizione.
Conclusione
strrpos() restituisce la posizione in byte dell'ultima occorrenza di una sottostringa, oppure false se non ve n'è nessuna — quindi confrontate sempre il risultato con !== false. Combinatela con un $offset negativo per ignorare il testo finale, passate a strripos() per la corrispondenza case-insensitive e usate mb_strrpos() quando la stringa contiene caratteri multibyte.