Podstawową funkcją służącą do porównywania ciągów jest
strcmp(). Jako jedyne 2 parametry przyjmuje ona
ciągi tekstowe, które mają być porównane. Funkcja ta zwraca wartość
0 jeśli ciągi są takie same, wartość większą od zera jeśli pierwszy
ciąg jest większy od drugiego lub wartość mniejszą od zera jeśli
pierwszy ciąg jest mniejszy od drugiega. Funkcja ta rozróżnia
wielkość znaków. Jeśli zachodzi potrzeba porównania dwóch ciągów,
to należy użyć funkcji strcasecmp() (parametry i
wartości zwracane takie jak przy funkcji strcmp). Istnieje także
funkcja strncmp(), która porównuje tylko taką
ilość początkowych znaków z podanych ciągów, jaka została podana
jako trzeci parametr tej funkcji. Oczywiście istnieje też wersja
funkcji strncmp() ignorująca wielkość znaków:
strncasecmp().
Istnieje racjonalne wytłumaczenie dlaczego ciągi należy porównywać
za pomocą funkcji strcmp() lub pochodnych a nie zwykłego operatora
porównania '=='. Interpreter języka PHP stara się być mądrzejszy od
programisty automatycznie konwertując typy zmiennych aby przy
porównywaniu ich były takie same.
Przykład 9.1. Proste porównywanie ciągów
<?php $a=0; $b="0papa"; if($a==$b) echo "Tak"; else echo "Nie"; ?>
|
Powyższy przykład wyświetli "Tak", pomimo że te zmienne są różne.
Dlaczego? Ponieważ PHP automatycznie konwertuje zmienną $b do typu
liczbowego, przez co zamieniana jest ona na liczbową wartość 0
(która faktycznie jest na pierwszym miejscu ciągu - pozostałe znaki
są odrzucane ponieważ nie są liczbami). Można teoretycznie użyć
operatora "===" - porównania nie tylko wartości, ale też typu.
Przykład 9.2. Operator identyczności
<?php $a=0; $b="0"; if($a===$b) echo "Tak"; else echo "Nie"; ?>
|
Powyższy przykład wyświetli "Nie", bo pomimo że obie zmienne mają
wartość 0, to zmienna $a jest liczbą, a zmienna
$b ciągiem tekstowym.
Funkcja strstr() służy do sprawdzania, czy
podany ciąg jest fragmentem innego ciągu. Funkcja przyjmuje dwa
parametry: przeszukiwany ciąg ('stóg siana') i szukany ciąg
('igła'). Jeśli dany ciąg jest fragmentem podanego, to zwracany
jest ciąg - fragment przeszukiwanego ciągu od pierwszego
wystąpienia szukanego ciągu do końca.
Przykład 9.3. Zastosowanie funkcji strstr
<?php $email = "prezydent@polska.pl"; $domena = strstr($email, "@"); echo $domena; ?>
|
Powyższy przykład wyświetli "@polska.pl". Jeśli ciąg nie jest
znaleziony, to zwracana jest wartość FALSE, dzięki czemu funkcję tą
można używać w instrukcjach warunkowych.
Przykład 9.4. Użycie funkcji strstr() w warunku
<?php $email = "prezydent@polska.pl"; if(strstr($email, "polska")!==False) echo "Email ma w sobie słowo 'polska'"; ?>
|
Przy używaniu tej funkcji trzeba pamiętać o jednej rzeczy. Łatwo
jest pomylić zwracaną wartość 'znaleziono na pozycji 0' i 'nie
znaleziono', ponieważ wartość logiczna 'true' przy porównaniach
może być skonwertowana do wartości liczbowej 0. Aby tego uniknąć
należy używać operatora porównania ze sprawdzaniem typu ('===' lub
'!==').
Istnieje także wersja tej funkcji ignorująca wielkość znaków:
stristr()(przyjmowane parametry i zwracane
wartości takie jak przy funcji strstr).
Pomimo, że funkcji strstr() można używać do sprawdzania czy jeden
ciąg jest częścią drugiego, to jest ona nieefektywna. Lepiej
skorzystać z funkcji strpos().
Do sprawdzania, czy ciąg tekstowy pasuje do wyrażenia regularnego
używa się funkcji ereg() która jako pierwszy
parametr przyjmuje wyrażenie regularne, a jako drugi ciąg który ma
być porównany z wyrażeniem. Istnieje także wersja tej funkcji
ignorująca wielkość znaków: eregi(). Zwracana jest
wartość true jeśli ciąg pasuje do wyrażenia regularnego, a false
jeśli nie pasuje.
Zazwyczaj przy instrukcjach warunkowych w którch korzysta się z
funkcji sprawdzającej jakiś warunek, funkcja ta zwraca wartość TRUE
jeśli warunek jest spełniony, np. funkcja ereg zwraca tą wartość
jeśli dany ciąg pasuje do danego wyrażenia regularnego.
Przykład 9.5. Użycie funkcji ereg w warunku
<?php if(ereg(".*", $ciag)) echo "Znalazłem!"; ?>
|
W przypadku funkcji strcmp() i pochodnych jest trochę inaczej, gdyż
jeśli ciągi są identyczne to zwracana jest wartość 0 uznawana za
logiczne FALSE.
Przykład 9.6. Porównywanie ciągów przy użyciu funkcji strcmp
<?php if(!strcmp("cośtam", $string)) echo " to cośtam!"; ?>
|