Która funkcja PHP zwróci pozycję, na której w napisie „ala ma kota” zaczyna się słowo „kota”?
A.
strpos("kota", "ala ma kota");
B.
substr("ala ma kota", "kota");
C.
strpos("ala ma kota", "kota");
D.
strlen("ala ma kota");
Funkcja strpos('ala ma kota', 'kota') jest tutaj właściwa, bo w PHP służy właśnie do wyszukiwania pozycji pierwszego wystąpienia fragmentu tekstu w innym tekście. Pierwszy argument to napis, w którym szukamy, czyli tzw. haystack, a drugi argument to szukany fragment, czyli needle. W napisie „ala ma kota” słowo „kota” zaczyna się od znaku o indeksie 7, bo PHP numeruje pozycje znaków od zera: a ma indeks 0, l ma 1, a ma 2, spacja ma 3 itd. To jest dość ważne w praktyce, bo wielu początkujących liczy od 1 i potem wynik wydaje się dziwny. Z mojego doświadczenia strpos bardzo często używa się np. do sprawdzania, czy adres e-mail zawiera znak @, czy w tekście występuje konkretne słowo albo czy nazwa pliku ma określone rozszerzenie. Dobra praktyka w PHP mówi też, żeby wynik porównywać z false operatorem ===, np. strpos($tekst, 'kota') === false, ponieważ pozycja 0 jest poprawnym wynikiem, ale w zwykłym warunku może zostać potraktowana jak fałsz. Taki drobiazg, a potrafi zrobić nieprzyjemny błąd w aplikacji.
W tym pytaniu kluczowe jest zrozumienie, że chodzi o znalezienie pozycji fragmentu tekstu wewnątrz większego napisu, a nie o długość tekstu ani wycinanie jego części. Funkcja strpos w PHP ma ustaloną kolejność argumentów: najpierw podaje się cały napis, w którym szukamy, a dopiero potem szukaną frazę. Jeśli ktoś zapisze strpos('kota', 'ala ma kota'), to tak naprawdę pyta PHP, czy cały tekst „ala ma kota” znajduje się wewnątrz krótkiego napisu „kota”. To oczywiście nie pasuje i funkcja zwróci false, a nie oczekiwaną pozycję. To częsty błąd myślowy: użytkownik wie, że strpos służy do szukania, ale zamienia miejscami argumenty. Funkcja strlen('ala ma kota') działa zupełnie inaczej, bo zwraca długość napisu, czyli liczbę znaków, w tym także spacje. Nie wskazuje, gdzie zaczyna się słowo. Z kolei substr służy do pobierania wycinka tekstu od podanej pozycji, np. substr('ala ma kota', 7) zwróciłoby „kota”. Nie jest to jednak funkcja wyszukująca. Co więcej, drugi argument substr powinien być liczbą oznaczającą offset, a nie tekstem „kota”, więc taki zapis jest koncepcyjnie pomieszany. W praktyce warto zapamiętać prostą zasadę: strlen mierzy długość, substr wycina fragment, a strpos szuka pozycji. Moim zdaniem to jedna z tych rzeczy w PHP, które dobrze jest przećwiczyć na kilku krótkich napisach, bo potem przy walidacji formularzy i analizie tekstu bardzo często się przydaje.