strpos($haystack, $needle) restituisce la posizione del primo $needle dentro $haystack, contata da 0, oppure false se non c'è. Verifica sempre il risultato con !== false, perché una corrispondenza all'inizio restituisce 0.
Se su PHP 8 ti basta una risposta sì o no, str_contains() è più chiara. Usa strpos() quando la posizione conta.
Sintassi
strpos(string $haystack, string $needle, int $offset = 0): int|false
La ricerca distingue maiuscole e minuscole. $offset indica da dove iniziare a cercare; un offset negativo conta dalla fine della stringa.
La trappola di !== false
0 e false sono uguali nel confronto debole (==). Una corrispondenza alla posizione 0 viene quindi trattata come "non trovato" da qualsiasi controllo non stretto.
La stessa regola vale per stripos(), strrpos() e array_search(), che possono tutte restituire 0 per una corrispondenza reale.
Ricerca senza distinzione tra maiuscole e minuscole con stripos
stripos() accetta gli stessi argomenti e ignora maiuscole e minuscole delle lettere ASCII.
Trovare l'ultima occorrenza con strrpos
strrpos() restituisce la posizione dell'ultima corrispondenza. È il modo standard per ottenere l'estensione di un file o l'ultimo segmento di un percorso.
Per i nomi di file in particolare, pathinfo($file, PATHINFO_EXTENSION) lo fa per te. Tagliare la stringa alla posizione è trattato nella pagina su substr().
Iniziare la ricerca da un offset
Il terzo argomento salta l'inizio della stringa. Un offset negativo parte quel numero di caratteri prima della fine.
Trovare tutte le occorrenze
strpos() trova una corrispondenza. Usa un ciclo e sposta l'offset oltre ogni corrispondenza per trovarle tutte:
Ti serve solo il conteggio? substr_count($text, 'the') è più breve. Per gli schemi, preg_match_all() con PREG_OFFSET_CAPTURE restituisce ogni corrispondenza con la sua posizione.
Testo giapponese: posizione in byte e posizione in caratteri
strpos() trova correttamente il testo multibyte, ma il numero che restituisce è in byte. In UTF-8 i kana e i kanji comuni occupano 3 byte ciascuno, quindi in un testo tutto giapponese la posizione in byte è il triplo di quella in caratteri, e in un testo misto le due si allontanano in modi meno evidenti. mb_strpos() restituisce i caratteri, ed è ciò che si aspetta mb_substr().
Mescolare le due è un bug classico: passare un risultato di strpos() a mb_substr() parte troppo avanti nella stringa. Usa strpos con substr, e mb_strpos con mb_substr.
Domande frequenti
Cosa restituisce strpos() in PHP?
La posizione della prima corrispondenza come intero, contata da 0, oppure false se l'ago non viene trovato. strpos('hello', 'l') restituisce 2.
Perché serve !== false con strpos()?
Perché una corrispondenza proprio all'inizio restituisce 0, e 0 == false è vero. if (strpos($s, 'a')) tratta una corrispondenza alla posizione 0 come "non trovato". Confronta sempre con strpos($s, 'a') !== false.
Qual è la differenza tra strpos, stripos e strrpos?
strpos() trova la prima corrispondenza e distingue maiuscole e minuscole. stripos() trova la prima corrispondenza ignorandole. strrpos() trova l'ultima corrispondenza. strripos() trova l'ultima corrispondenza ignorando maiuscole e minuscole.
Meglio strpos o str_contains per verificare se una stringa contiene un testo?
Su PHP 8 usa str_contains($haystack, $needle), che restituisce un semplice true o false e non ha la trappola della posizione 0. Usa strpos() quando ti serve la posizione stessa.
Come uso strpos con il testo giapponese?
strpos() trova correttamente il testo giapponese ma restituisce una posizione in byte. Se passi la posizione a mb_substr() o la mostri a un utente, usa mb_strpos(), che restituisce la posizione in caratteri.