strpos($haystack, $needle) renvoie la position du premier $needle dans $haystack, comptée depuis 0, ou false s'il n'y est pas. Testez toujours le résultat avec !== false, car une correspondance au début renvoie 0.
Si vous n'avez besoin que d'une réponse oui ou non en PHP 8, str_contains() est plus claire. Utilisez strpos() quand la position compte.
Syntaxe
strpos(string $haystack, string $needle, int $offset = 0): int|false
La recherche est sensible à la casse. $offset indique où commencer à chercher ; un offset négatif compte depuis la fin de la chaîne.
Le piège de !== false
0 et false sont égaux en comparaison souple (==). Une correspondance à la position 0 est donc traitée comme « non trouvé » par tout test qui n'est pas strict.
La même règle s'applique à stripos(), strrpos() et array_search(), qui peuvent toutes renvoyer 0 pour une vraie correspondance.
Recherche insensible à la casse avec stripos
stripos() prend les mêmes arguments et ignore la casse des lettres ASCII.
Trouver la dernière occurrence avec strrpos
strrpos() renvoie la position de la dernière correspondance. C'est la façon standard d'obtenir l'extension d'un fichier ou le dernier segment d'un chemin.
Pour les noms de fichiers en particulier, pathinfo($file, PATHINFO_EXTENSION) le fait pour vous. Couper la chaîne à la position trouvée est expliqué sur la page substr().
Commencer la recherche à un offset
Le troisième argument saute le début de la chaîne. Un offset négatif commence autant de caractères avant la fin.
Trouver toutes les occurrences
strpos() trouve une correspondance. Bouclez et déplacez l'offset après chaque correspondance pour les trouver toutes :
Seulement le nombre ? substr_count($text, 'the') est plus court. Pour des motifs, preg_match_all() avec PREG_OFFSET_CAPTURE renvoie chaque correspondance avec sa position.
Texte japonais : position en octets ou en caractères
strpos() trouve correctement du texte multioctet, mais le nombre qu'elle renvoie est en octets. Les kana et les kanji courants occupent 3 octets chacun en UTF-8, donc dans un texte entièrement japonais la position en octets vaut trois fois la position en caractères, et dans un texte mélangé les deux s'écartent de façon moins évidente. mb_strpos() renvoie des caractères, ce qu'attend mb_substr().
Mélanger les deux est un bug classique : passer un résultat de strpos() à mb_substr() commence trop loin dans la chaîne. Utilisez strpos avec substr, et mb_strpos avec mb_substr.
Questions fréquentes
Que renvoie strpos() en PHP ?
La position de la première correspondance sous forme d'entier, comptée depuis 0, ou false si l'aiguille n'est pas trouvée. strpos('hello', 'l') renvoie 2.
Pourquoi faut-il !== false avec strpos() ?
Parce qu'une correspondance tout au début renvoie 0, et 0 == false est vrai. if (strpos($s, 'a')) traite une correspondance à la position 0 comme « non trouvé ». Comparez toujours avec strpos($s, 'a') !== false.
Quelle est la différence entre strpos, stripos et strrpos ?
strpos() trouve la première correspondance et est sensible à la casse. stripos() trouve la première correspondance en ignorant la casse. strrpos() trouve la dernière correspondance. strripos() trouve la dernière correspondance en ignorant la casse.
Faut-il utiliser strpos ou str_contains pour vérifier qu'une chaîne contient un texte ?
En PHP 8, utilisez str_contains($haystack, $needle), qui renvoie simplement true ou false et n'a pas le piège de la position 0. Utilisez strpos() quand vous avez besoin de la position elle-même.
Comment utiliser strpos avec du texte japonais ?
strpos() trouve correctement du texte japonais mais renvoie une position en octets. Si vous passez la position à mb_substr() ou l'affichez à un utilisateur, utilisez mb_strpos(), qui renvoie la position en caractères.