Obsługa stringów


Porównywanie stringów

Podstawową funkcją służącą do porównywania stringów jest strcmp(). Przyjmuje ona dwa argumenty – nazwy stringów, 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 jest większy od drugiego, lub wartość mniejszą od zera jeśli pierwszy 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 tak, 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().

Racjonalnym wytłumaczeniem, dlaczego ciągi należy porównywać za pomocą funkcji strcmp() lub pochodnych, a nie zwykłego operatora porównania ‘==’ jest fakt, że interpreter języka PHP automatycznie konwertuje typy zmiennych tak, aby przy porównywaniu były takie same. Tak więc warunek:

<?
 
    $a = 0;
    $b = "0ala";

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

?>
wyświetli “Tak”, pomimo że te zmienne są różne. PHP automatycznie konwertuje zmienną $b do typu liczbowego, przez co zamieniana jest ona na liczbową wartość 0 (która faktycznie jest na pierwszym miejscu stringa – 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”, gdyż pomimo że obie zmienne mają wartość 0, to zmienna $a jest liczbą, a zmienna $b ciągiem tekstowym.

Funkcja strstr() służy do sprawdzenia, czy podany string jest fragmentem innego. Funkcja przyjmuje dwa parametry: string przeszukiwany (‘stóg siana’) i szukany (‘igła’). Jeśli dany ciąg jest fragmentem podanego, to zwracany jest ciąg – fragment przeszukiwanego stringa 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 funkcji tej można używać w instrukcjach warunkowych, np.:

<?
 
    $email = "prezydent@polska.pl";

    if (strstr($email, "polska") !== false)
        echo "Email zawiera słowo 'polska'";

?>
Trzeba pamiętać także, że łatwo jest pomylić zwracaną wartość “0” z “nie znaleziono”, ponieważ przy porównywaniu z “false” string zostanie skonwertowany do wartości liczbowej. 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).

Wyciąganie fragmentów stringów

Bardzo często zachodzi potrzeba wyciągnięcia ze zmiennej tekstowej tylko pewnego jej fragmentu. Najłatwiej jest, jeśli znasz długość wyciąganego fragmentu i pozycja, w której się znajduje w zmiennej. Np. jeśli ze zmiennej zawierającej “1992/11/19” chcesz wyciągnąć rok. Wiadomo, że rok jest na samym początku i ma 4 znaki. Najłatwiej jest użyć funkcji substr().

Jako pierwszy paramter pobiera ona string, z którego będzie wycinany fragment, jako drugi – miejsce, z którego rozpocznie się wycinanie (0 jeśli od pierwszego znaku, liczba ujemna jeśli ma to być ilość znaków od końca), a ostatni, opcjonalny parametr wskazuje ilość znaków do wycięcia (jeśli zostanie pominięty, to zwrócony zostanie podciąg od wskazanego znaku początkowego do końca ciągu).

Zatem, w tym przypadku wywołanie funkcji substr() będzie wyglądało tak:

<?
 
    $data = "1992/11/19";

    $rok = substr($data, 0, 4);
    echo $rok;

?>
Jest to najprostsza z sytuacji. Bardziej skomplikowanym przykładem będzie wyciągnięcie z tej samej daty wszystkich pól. Można oczywiście trzy razy wywołać funkcję substr, ale wydajniejszą metodą jest rozbicie tekstu na tablicę korzystając z opisanej przy okazji tablic funkcji explode. Zatem po wykonaniu kodu:
<?
 
    $data = "1992/11/19";

    $tablica = explode("/", $data);
    echo "rok: $tablica[0], miesiąc: $tablica[1], dzień: $tablica[2]";

?>
w pierwszym elemencie tablicy znajdować się będzie rok, w drugim miesiąc, a w trzecim dzień z podanej daty. Można także wykorzystać tę funkcję w bardziej skomplikowany sposób – do rozbicia stringa zawierającego datę i czas:
<?
 
    $tekst = "19/11/1982 01:43:12";

    $dataiczas = explode(" ", $tekst);
    $data = explode("/", $dataiczas[0]);
    $czas = explode(":", $dataiczas[1]);

    echo "dzień: $data[0], miesiąc: $data[1], rok: $data[2]
";
    echo "godzina: $czas[0], minuta: $czas[1], sekunda: $czas[2]";

?>

Może także zajść potrzeba wyciągnięcia fragmentu stringa do wystąpienia określonego znaku, np. pierwszego zdania w tekście.

Warto wtedy użyć połączenia funkcji substr() i strpos(), która zwraca numer znaku, gdzie znajduje się pierwsze wystąpienie ciągu szukanego (podanego jako drugi parametr) w przeszukiwanym (podanym jako pierwszy parametr), lub false, jeśli pierwszy ciąg nie zawiera w sobie drugiego. Pierwsze zdanie z podanego ciągu można uzyskać tak:
<?
 
    $tekst = 'To jest tekst. Tego zdania nie będzie widać.';
    $zdanie = substr($tekst, 0, strpos($tekst, '.'));
    echo $zdanie;

?>

Na ekranie powinno wyświetlić się zdanie “To jest tekst” – bez kropki na końcu.

Podmiana fragmentów stringów

Do podmiany całych fragmentów ciągu służy funkcja str_replace(), która przyjmuje trzy argumenty: ciąg, który ma być podmieniony; ciąg, który ma go zastąpić i string, którego fragmenty będą podmieniane. Innymi słowy, wszystkie wystąpienia pierwszego ciągu w trzecim ciągu są zamieniane na drugi ciąg. UWAGA: zmienna podawana jako trzeci argument nie jest zmieniana. Poprawiony string jest zwracany przez funkcję. Przykład:

<?
 
    $tekst = "Jeśli jesteś za, podnieś rękę";

    $wynik = str_replace("za", "przeciw", $tekst);
    echo $wynik;

?>

Na ekranie powinien wyświetlić się tekst “Jeśli jesteś przeciw, podnieś rękę”.

Począwszy od wersji PHP 4.0.5, każdy z parametrów funkcji str_replace() może być tablicą. Jeśli zatem trzeci parametr jest tablicą, to operacja podmiany tekstów jest wykonywana na każdym elemencie tablicy, a zwracana zmienna także jest tablicą.

Natomiast jeśli tablicami są pierwszy i drugi parametr, to każdy element z pierwszej tablicy jest podmieniany na odpowiadający mu element drugiej tablicy. Jeśli pierwsza tablica ma więcej elementów niż druga, to te elementy z pierwszej tablicy, które nie mają odpowiednika w drugiej, zamieniane są na puste ciągi. Pozwala to na wiele podmian za jednym wywołaniem funkcji str_replace(), co ma również wpływ na wydajność skryptów.

Podmiana znaków w stringach

W PHP można znaleźć także funkcję, która zamieni wszystkie wystąpienia podanych znaków na inne znaki. Dzięki temu można np. usunąć wszystkie polskie znaki diakrytyczne albo skonwertować je na inną stronę kodową.

Odpowiednia funkcja nazywa się się strtr() i przyjmuje trzy argumenty: string, w którym będą podmieniane znaki; ciąg zawierający znaki do podmiany i ciąg znaków podmieniających. W poniższym przykładzie polskie znaki diakrytyczne zostaną zamieniane na odpowiadające im litery alfabetu łacińskiego:

<?
 
    $tekst = "Zażółć gęślą jaźń";

    $wynik = strtr($tekst, 'ążśźęćńół', 'azszecnol');
    echo $wynik;

?>

Przydatne funkcje

Przedstawimy teraz kilka przydatnych funkcji operujących na stringach:

  • strlen($string) – zwraca ilość znaków w stringu,
  • nl2br($string) – do zamiany znaków końca wiersza na HTMLowe znaczniki (bardzo przydatne przy wyświetlaniu sformatowanego tekstu w oknie przeglądarki),
  • strip_tags($string) – usuwa wszystkie znaczniki HTML z podanego jako argument ciągu. Możliwe jest podanie opcjonalnego drugiego parametru – ciągu, zawierającego nazwy znaczników HTML, które mają pozostać,
  • chop($string), trim($string), ltrim($string), rtrim($string) – usuwa białe znaki (spacja, tabulator, znacznik nowego wiersza) z początku lub końca ciągu. Funkcja chop(), tak jak i rtrim(), usuwa te znaki z końca ciągu, ltrim() z początku, a trim() z początku i końca.
  • Czy artykuł był pomocny ?
  • Tak   Nie

Tematy powiązane

Szukaj
Generic filters
Tylko dokładne dopasowania
Szukaj w tytułach
Szukaj w treści
Wyświetl posty typu:
lub