str_contains($haystack, $needle) renvoie true si $needle apparaît quelque part dans $haystack, et false sinon. Elle a été ajoutée en PHP 8.0 et est sensible à la casse.
Contrairement à strpos(), elle renvoie un vrai booléen, donc pas de piège du type « trouvé à la position 0 ressemble à false ».
Syntaxe
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
Les trois ont été ajoutées en PHP 8.0 et travaillent octet par octet, elles gèrent donc correctement le japonais et les autres textes UTF-8 sans version mb_.
Vérifier le début ou la fin avec str_starts_with et str_ends_with
Contient, sans tenir compte de la casse
Il n'existe pas de str_icontains(). Mettez d'abord les deux chaînes en minuscules. mb_strtolower() met aussi en minuscules les lettres hors ASCII, comme É ou le cyrillique, que strtolower() laisse telles quelles.
L'aiguille vide renvoie true
Une aiguille vide est trouvée dans toute chaîne, y compris une chaîne vide. Cela compte quand l'aiguille vient d'un champ de recherche que l'utilisateur a laissé vide.
Vérifier si une chaîne contient l'un ou tous de plusieurs mots
str_contains() prend une seule aiguille. Bouclez sur un tableau d'aiguilles : renvoyez dès qu'une correspond pour « l'un », ou dès qu'une échoue pour « tous ».
Pour vérifier si une valeur est l'un des éléments d'un tableau, et non une sous-chaîne d'une chaîne, utilisez in_array().
Avant PHP 8 : strpos !== false
Le code qui doit tourner en PHP 7 utilise strpos() avec une comparaison stricte. Il donne la même réponse que str_contains(), sauf pour une aiguille vide : strpos() en PHP 7 affichait Warning: strpos(): Empty needle et renvoyait false.
La dernière ligne affiche bool(false) alors que le texte est présent, car php se trouve à la position 0. Remplacer ces tests par str_contains() est l'une des mises à niveau PHP 8 les plus faciles.
Questions fréquentes
Comment vérifier si une chaîne contient un mot en PHP ?
En PHP 8, utilisez str_contains($haystack, $needle), qui renvoie true ou false : str_contains('Hello world', 'world') vaut true. En PHP 7, utilisez strpos($haystack, $needle) !== false.
str_contains est-elle sensible à la casse ?
Oui. Pour une vérification insensible à la casse, mettez les deux côtés en minuscules : str_contains(mb_strtolower($haystack), mb_strtolower($needle)), ou utilisez stripos($haystack, $needle) !== false.
Pourquoi str_contains renvoie-t-elle true pour une chaîne vide ?
Toute chaîne contient la chaîne vide, donc str_contains('abc', '') renvoie true. Si l'aiguille vient d'une saisie utilisateur, vérifiez d'abord qu'elle n'est pas vide.
Comment vérifier si une chaîne commence ou se termine par quelque chose en PHP ?
Utilisez str_starts_with($s, 'http') et str_ends_with($s, '.pdf'), ajoutées toutes deux en PHP 8.0. Comme str_contains(), elles sont sensibles à la casse et renvoient un booléen.