stripos()
La funzione stripos() in PHP trova la posizione della prima occorrenza di una sottostringa in una stringa senza distinzione tra maiuscole e minuscole.
Introduzione
stripos() trova la posizione della prima occorrenza di una sottostringa all'interno di una stringa, ignorando le maiuscole e minuscole. Restituisce l'indice a base zero in cui inizia la corrispondenza, oppure false se la sottostringa non è presente.
La i nel nome sta per case-insensitive: "PHP", "php" e "Php" corrispondono tutti allo stesso modo. Se hai bisogno di una ricerca con distinzione tra maiuscole e minuscole, usa strpos(). Questa pagina tratta la sintassi, il trabocchetto critico !== false, il parametro opzionale $offset e come stripos() si relaziona alle altre funzioni di posizione.
Sintassi
stripos(string $haystack, string $needle, int $offset = 0): int|false| Parametro | Descrizione |
|---|---|
$haystack | La stringa in cui cercare. |
$needle | La sottostringa da cercare. |
$offset | Opzionale. L'indice in $haystack da cui inizia la ricerca. Il valore predefinito è 0 (l'inizio). Un offset negativo conta dalla fine della stringa. |
Valore restituito: la posizione a base zero della prima corrispondenza (un int), oppure false se $needle non viene trovato.
Un esempio base
Il needle "fox" è in minuscolo ma l'haystack contiene "FOX". Poiché stripos() ignora le maiuscole, corrisponde comunque e stampa:
Found 'fox' at position 16Sostituendo con strpos() il risultato sarebbe false, poiché le maiuscole differiscono.
Il trabocchetto !== false
Questo è il bug più comune con stripos() (e con ogni funzione *pos()). Quando una corrispondenza viene trovata all'inizio della stringa, il valore restituito è 0 — e 0 è falsy in PHP. Un controllo lasco come if (stripos(...)) tratterebbe una vera corrispondenza come "non trovata":
<?php
$pos = stripos("Hello world", "hello");
// Wrong: 0 is falsy, so this branch runs even though there IS a match
if ($pos) {
echo "loose check: found\n";
} else {
echo "loose check: NOT found (wrong!)\n";
}
// Correct: compare against false with the strict !== operator
if ($pos !== false) {
echo "strict check: found at position $pos\n";
} else {
echo "strict check: not found\n";
}Output:
loose check: NOT found (wrong!)
strict check: found at position 0Confronta sempre il risultato con !== false quando vuoi solo sapere se la sottostringa esiste.
Uso del parametro $offset
Il terzo argomento ti permette di iniziare la ricerca a metà della stringa — utile per trovare la seconda (o successiva) occorrenza:
<?php
$text = "PHP is great. PHP is everywhere.";
$first = stripos($text, "php"); // start at 0
$second = stripos($text, "php", $first + 1); // skip past the first match
echo "First occurrence: $first\n";
echo "Second occurrence: $second\n";Output:
First occurrence: 0
Second occurrence: 14Un uso pratico: filtro di parole chiave senza distinzione di maiuscole
Poiché ignora le maiuscole, stripos() è particolarmente adatto per i controlli del tipo "questo testo menziona X?", come contrassegnare i messaggi che contengono una parola vietata indipendentemente da come viene scritta:
<?php
$message = "Get this AMAZING deal now!";
$banned = ["amazing", "free", "winner"];
foreach ($banned as $word) {
if (stripos($message, $word) !== false) {
echo "Blocked: contains '$word'\n";
break;
}
}Output:
Blocked: contains 'amazing'Funzioni correlate
| Funzione | Maiuscole/minuscole | Cerca da |
|---|---|---|
stripos() | Insensibile | Inizio → prima corrispondenza |
strpos() | Sensibile | Inizio → prima corrispondenza |
strripos() | Insensibile | Fine → ultima corrispondenza |
stristr() | Insensibile | Restituisce la sottostringa corrispondente, non la sua posizione |
Vedi anche substr() per estrarre testo una volta che hai una posizione, e str_replace() per sostituzioni con distinzione tra maiuscole e minuscole.
Conclusione
stripos() restituisce la posizione a base zero della prima corrispondenza senza distinzione di maiuscole di una sottostringa, oppure false se non ne esiste nessuna. Ricorda di testare il risultato con !== false affinché una corrispondenza alla posizione 0 non venga scambiata per "non trovata", usa $offset per trovare occorrenze successive e ricorri a strpos() quando le maiuscole contano.