W3docs

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
ParametroDescrizione
$haystackLa stringa in cui cercare.
$needleLa sottostringa da cercare.
$offsetOpzionale. 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

php— editable, runs on the server

"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 7

Confrontare 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);    // 3

Un 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.

Esercitazione

Pratica
Cosa fa la funzione 'strrpos' in PHP?
Cosa fa la funzione 'strrpos' in PHP?
Was this page helpful?