str_contains($haystack, $needle) retorna true se $needle aparece em qualquer lugar de $haystack, e false caso contrário. Ele foi adicionado no PHP 8.0 e diferencia maiúsculas e minúsculas.
Ao contrário do strpos(), ele retorna um booleano de verdade, então não existe a armadilha de "encontrado na posição 0 parece false".
Sintaxe
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
Os três foram adicionados no PHP 8.0 e trabalham byte a byte, então lidam corretamente com japonês e outros textos UTF-8 sem uma versão mb_.
Verificar o início ou o fim com str_starts_with e str_ends_with
Contém sem diferenciar maiúsculas
Não existe str_icontains(). Deixe as duas strings em minúsculas antes. O mb_strtolower() também converte letras fora do ASCII, como É ou cirílico, que o strtolower() deixa como estão.
A agulha vazia retorna true
Uma agulha vazia é encontrada em qualquer string, inclusive numa vazia. Isso importa quando a agulha vem de uma caixa de busca que o usuário deixou em branco.
Verificar se uma string contém alguma ou todas de várias palavras
O str_contains() recebe uma agulha. Percorra um array de agulhas: retorne assim que uma bater, para "alguma", ou assim que uma falhar, para "todas".
Para verificar se um valor é um dos elementos de um array, e não uma substring de uma string, use in_array().
Antes do PHP 8: strpos !== false
Código que precisa rodar no PHP 7 usa strpos() com comparação estrita. Ele dá a mesma resposta que o str_contains(), exceto para uma agulha vazia: o strpos() do PHP 7 imprimia Warning: strpos(): Empty needle e retornava false.
A última linha imprime bool(false) mesmo com o texto presente, porque php está na posição 0. Trocar essas verificações por str_contains() é uma das atualizações para o PHP 8 mais fáceis.
Perguntas frequentes
Como verifico se uma string contém uma palavra no PHP?
No PHP 8, use str_contains($haystack, $needle), que retorna true ou false: str_contains('Hello world', 'world') é true. No PHP 7, use strpos($haystack, $needle) !== false.
O str_contains diferencia maiúsculas e minúsculas?
Sim. Para uma verificação sem diferenciar, deixe os dois lados em minúsculas: str_contains(mb_strtolower($haystack), mb_strtolower($needle)), ou use stripos($haystack, $needle) !== false.
Por que o str_contains retorna true para uma string vazia?
Toda string contém a string vazia, então str_contains('abc', '') retorna true. Se a agulha vem da entrada do usuário, verifique antes se ela não está vazia.
Como verifico se uma string começa ou termina com algo no PHP?
Use str_starts_with($s, 'http') e str_ends_with($s, '.pdf'), ambos adicionados no PHP 8.0. Como o str_contains(), eles diferenciam maiúsculas e minúsculas e retornam um bool.