str_contains($haystack, $needle) zwraca true, jeśli $needle występuje gdziekolwiek w $haystack, a w przeciwnym razie false. Dodano ją w PHP 8.0 i rozróżnia wielkość liter.
W przeciwieństwie do strpos() zwraca prawdziwą wartość logiczną, więc nie ma pułapki „znalezione na pozycji 0 wygląda jak false”.
Składnia
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
Wszystkie trzy dodano w PHP 8.0 i działają bajt po bajcie, więc poprawnie obsługują polski, japoński i inny tekst UTF-8 bez wersji mb_.
Sprawdzanie początku lub końca przez str_starts_with i str_ends_with
Zawieranie bez rozróżniania wielkości liter
Nie ma funkcji str_icontains(). Najpierw zamień oba stringi na małe litery. mb_strtolower() zmienia też litery spoza ASCII, takie jak É, polskie znaki czy cyrylica, których strtolower() nie rusza.
Pusta igła zwraca true
Pusta igła znajduje się w każdym stringu, także w pustym. Ma to znaczenie, gdy igła pochodzi z pola wyszukiwania, które użytkownik zostawił puste.
Czy string zawiera którekolwiek lub wszystkie z kilku słów
str_contains() przyjmuje jedną igłę. Przejdź pętlą po tablicy igieł: dla „którekolwiek” zwróć wynik, gdy tylko jedna pasuje, a dla „wszystkie”, gdy tylko jedna nie pasuje.
Aby sprawdzić, czy wartość jest jednym z elementów tablicy, a nie podciągiem stringa, użyj in_array().
Przed PHP 8: strpos !== false
Kod, który musi działać w PHP 7, używa strpos() ze ścisłym porównaniem. Daje tę samą odpowiedź co str_contains(), z wyjątkiem pustej igły: strpos() w PHP 7 wypisywało Warning: strpos(): Empty needle i zwracało false.
Ostatnia linia wypisuje bool(false), choć tekst tam jest, bo php leży na pozycji 0. Zastąpienie takich sprawdzeń przez str_contains() to jedna z najłatwiejszych zmian przy przejściu na PHP 8.
Najczęściej zadawane pytania
Jak sprawdzić, czy string zawiera słowo w PHP?
W PHP 8 użyj str_contains($haystack, $needle), które zwraca true albo false: str_contains('Hello world', 'world') daje true. W PHP 7 użyj strpos($haystack, $needle) !== false.
Czy str_contains rozróżnia wielkość liter?
Tak. Aby sprawdzić bez rozróżniania wielkości liter, zamień obie strony na małe litery: str_contains(mb_strtolower($haystack), mb_strtolower($needle)) albo użyj stripos($haystack, $needle) !== false.
Dlaczego str_contains zwraca true dla pustego stringa?
Każdy string zawiera pusty string, więc str_contains('abc', '') zwraca true. Jeśli igła pochodzi od użytkownika, najpierw sprawdź, czy nie jest pusta.
Jak sprawdzić, czy string zaczyna się lub kończy czymś w PHP?
Użyj str_starts_with($s, 'http') i str_ends_with($s, '.pdf'), obu dodanych w PHP 8.0. Podobnie jak str_contains() rozróżniają wielkość liter i zwracają wartość logiczną.