Menu

strpos() w PHP: pozycja podciągu w stringu

strpos($haystack, $needle) zwraca pozycję pierwszego wystąpienia $needle albo false, jeśli go nie znaleziono. Poznaj sprawdzenie !== false, stripos bez rozróżniania wielkości liter, ostatnie dopasowanie przez strrpos i znajdowanie wszystkich wystąpień.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

strpos($haystack, $needle) zwraca pozycję pierwszego $needle w $haystack, liczoną od 0, albo false, jeśli go tam nie ma. Zawsze sprawdzaj wynik przez !== false, bo dopasowanie na początku zwraca 0.

Jeśli w PHP 8 potrzebujesz tylko odpowiedzi tak lub nie, czytelniejsza jest str_contains(). Używaj strpos(), gdy liczy się pozycja.

Składnia

strpos(string $haystack, string $needle, int $offset = 0): int|false

Wyszukiwanie rozróżnia wielkość liter. $offset mówi, gdzie zacząć szukanie; ujemny offset liczy od końca stringa.

Pułapka !== false

0 i false są równe przy luźnym porównaniu (==). Dopasowanie na pozycji 0 jest więc traktowane jak „nie znaleziono” przez każde sprawdzenie, które nie jest ścisłe.

Ta sama zasada dotyczy stripos(), strrpos() i array_search(), które wszystkie mogą zwrócić 0 dla prawdziwego dopasowania.

Wyszukiwanie bez rozróżniania wielkości liter przez stripos

stripos() przyjmuje te same argumenty i ignoruje wielkość liter ASCII.

Ostatnie wystąpienie przez strrpos

strrpos() zwraca pozycję ostatniego dopasowania. To standardowy sposób na pobranie rozszerzenia pliku albo ostatniego segmentu ścieżki.

Dla nazw plików pathinfo($file, PATHINFO_EXTENSION) robi to za ciebie. Cięcie stringa w danej pozycji opisuje strona substr().

Rozpoczęcie wyszukiwania od offsetu

Trzeci argument pomija początek stringa. Ujemny offset zaczyna tyle znaków przed końcem.

Znajdowanie wszystkich wystąpień

strpos() znajduje jedno dopasowanie. Aby znaleźć wszystkie, użyj pętli i przesuwaj offset za każde dopasowanie:

Potrzebujesz tylko liczby? substr_count($text, 'the') jest krótsze. Dla wzorców preg_match_all() z PREG_OFFSET_CAPTURE zwraca każde dopasowanie z jego pozycją.

Tekst japoński: pozycja w bajtach a pozycja w znakach

strpos() poprawnie znajduje tekst wielobajtowy, ale zwraca liczbę w bajtach. Kana i popularne kanji zajmują w UTF-8 po 3 bajty, więc w tekście w całości japońskim pozycja w bajtach jest trzy razy większa niż w znakach, a w tekście mieszanym (także z polskimi literami) obie wartości rozjeżdżają się w mniej oczywisty sposób. mb_strpos() zwraca znaki, czyli to, czego oczekuje mb_substr().

Mieszanie obu to klasyczny błąd: przekazanie wyniku strpos() do mb_substr() zaczyna za daleko w stringu. Używaj strpos z substr, a mb_strpos z mb_substr.

Najczęściej zadawane pytania

Co zwraca strpos() w PHP?

Pozycję pierwszego dopasowania jako liczbę całkowitą liczoną od 0 albo false, jeśli igły nie znaleziono. strpos('hello', 'l') zwraca 2.

Dlaczego przy strpos() potrzebne jest !== false?

Bo dopasowanie na samym początku zwraca 0, a 0 == false jest prawdą. if (strpos($s, 'a')) traktuje dopasowanie na pozycji 0 jak „nie znaleziono”. Zawsze porównuj przez strpos($s, 'a') !== false.

Czym różnią się strpos, stripos i strrpos?

strpos() znajduje pierwsze dopasowanie i rozróżnia wielkość liter. stripos() znajduje pierwsze dopasowanie bez rozróżniania wielkości liter. strrpos() znajduje ostatnie dopasowanie. strripos() znajduje ostatnie dopasowanie bez rozróżniania wielkości liter.

Czy do sprawdzenia, czy string zawiera tekst, używać strpos czy str_contains?

W PHP 8 użyj str_contains($haystack, $needle), które zwraca zwykłe true lub false i nie ma pułapki z pozycją 0. Używaj strpos(), gdy potrzebujesz samej pozycji.

Jak używać strpos z tekstem japońskim?

strpos() poprawnie znajduje japoński tekst, ale zwraca pozycję w bajtach. Jeśli przekazujesz pozycję do mb_substr() albo pokazujesz ją użytkownikowi, użyj mb_strpos(), które zwraca pozycję w znakach.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ