webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> kursy online >> kurs php >> Część 9

Porównywanie ciągów

autor: Leszek 'leon' Krupiński, ostatnia modyfikacja: 2007-10-12

szukaj: Porównywanie ciągów Porównywanie ciągów kurs php kurs php

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 drugiego. 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. Tak więc warunek:

<?

$a=0;
$b="0papa";

if($a==$b)
 echo "Tak";
else
   echo "Nie";

?>

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, ale tu z kolei warunek:

<?

$a=0;
$b="0";

if($a===$b)
 echo "Tak";
else
   echo "Nie";

?>

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. Np.:

<?

$email = "prezydent@polska.pl";
$domena = strstr($email, "@");
echo $domena;

?>

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, np.:

<?

$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órych 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. W takim przypadku instrukcję warunkową można zapisać tak:

<?

if(ereg(".*", $ciag))
 echo "Znalazłem!";

?>

Natomiast 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. A więc instrukcja warunkowa porównująca ciągi może wyglądać tak:

<?

if(!strcmp("cośtam", $string))
 echo "$string to cośtam!";

?>

Leszek 'leon' Krupiński

Zagadnienia poruszane w tej części kursu:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org