Rozdział 6. ♦ Ciągi znaków, data i czas 169
Podczas tworzenia skryptów PHP często występuje konieczność przeszukiwania ciągów znaków. W realizacji tego zadania jest pomocnych kilka funkcji, są to: strpos, strrpos, stripos, strripos, strstr, stristr. Funkcja strpos zwraca numer pierwszej pozycji poszukiwanego ciągu. Jej wywołanie ma postać: strpos("ciąg przeszukiwany". "ciąg poszukiwany*) przy czym przeszukiwanie rozpoczyna się od początku ciągu, a pozycje ciągu przeszukiwanego numerowane są od zera (czyli pierwsza litera znajduje się na zerowej pozycji). Przykładowe wywołanie:
$pos = strposCabcdefg", "cde"):
spowoduje przypisanie zmiennej pos wartości 2. Odmianą funkcji strpos jest stripos Działa ona prawie identycznie jak strpos, lecz nie rozróżnia wielkości liter. Jeśli natomiast chcemy przeszukiwać ciągi od końca, czyli uzyskać pozycję ostatniego wystąpienia poszukiwanego ciągu, należy skorzystać z funkcji strrpos lub strripos. Przykładowe wywołanie:
$pos = strrposOabcdabcd". "ab"):
spowoduje przypisanie zmiennej pos wartości 4. Funkcja strripos działa tak samo jak strrpos, nie rozróżnia jedynie wielkości liter w ciągu.
Jeżeli w ciągu przeszukiwanym nie ma ciągu poszukiwanego, każda z wymienionych funkcji zwraca wartość false typu boolean. Na tę kwestię należy zwrócić szczególną uwagę, aby nie doprowadzić do powstania błędów w skrypcie wykorzystującym te funkcje. Przeanalizujmy poniższy fragment kodu:
<?php
$strl = "abcdabcd":
Jstr2 = "ab":
if(strpos($strl. $str2) = false){ echo("Ciąg $str2 nie został znaleziony w ciągu Jstrl.’):
}
else{
echoCCiąg $str2 został znaleziony w ciągu Jstrl.");
}
Chcemy sprawdzić, czy ciąg zapisany w zmiennej str2 znajduje się w ciągu strl. Wykorzystujemy zatem instrukcję warunkową i f i fakt, że funkcja strpos w przypadku nieznalezienia poszukiwanego ciągu zwraca wartość false. Jeśli jednak uruchomimy powyższy kod, będziemy zaskoczeni. Wyświetlony zostanie napis stwierdzający, że ciągu ab nie ma w ciągu abcdabcd — co jest oczywistą nieprawdą. Dlaczego tak się dzieje?
Odpowiedź kryje się w odpowiedzi na inne pytanie: jaką wartość zwraca wywołanie funkcji strpos z argumentami strl i str2? Skoro ciąg przeszukiwany strl zawiera łańcuch "abcdabcd", natomiast ciąg szukany str2 zawiera łańcuch "ab", wywołanie strpos (Jstrl. $str2) musi zwrócić wartość 0, ciąg ab występuje bowiem na samym początku ciągu abcdabcd. Co się zatem dzieje w instrukcji warunkowej if? Sprawdzany jest warunek 0 == false. Bezpośrednie porównanie jest niemożliwe, gdyż po