PHP/Przetwarzanie tekstu: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
→‎Modyfikacja ciągów: brak tagu zamykającego </p>
Nie podano opisu zmian
 
Linia 7:
Podstawową funkcją wyszukiwania jednego ciągu w drugim jest ''strpos()'' posiadająca także wariant ''stripos()'', w którym nie gra roli wielkość liter. Użyliśmy jej już raz podczas pisania księgi gości do sprawdzenia, czy wprowadzony adres WWW zawiera identyfikator protokołu. Przypomnijmy jeszcze raz ten skrypt:
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 30:
?>
</syntaxhighlight>
</source>
 
Funkcje działają następująco: za pierwszy parametr podajemy ciąg do przeszukania, za drugi - szukany, a następnie patrzymy na rezultat. ''strpos()'' powinien zwrócić nam pozycję, od której zaczyna się tekst, którego szukamy, przy czym znaki liczone są od zera. Jeżeli nic nie zostanie znalezione, dostaniemy wartość '''false'''. Z tego powodu powinniśmy zawsze wykorzystywać te funkcje z operatorami '''===''' oraz '''!==''' sprawdzającymi nie tylko wartość, ale i typ zwracanych danych. Oto interesująca sztuczka, która w jednej linijce pozwoli nam na sprawdzenie, czy ciąg został znaleziony i EWENTUALNE pobranie pozycji jego wystąpienia:
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 50:
?>
</syntaxhighlight>
</source>
 
Jeśli nie rozumiesz zastosowanej tu sztuczki, przypomnij sobie zabawy z wyrażeniami na początku podręcznika. PHP najpierw wykona przypisanie do zmiennej $id: ''$id = strpos($zrodlo, $szukany)''. Operator zwróci przypisywaną wartość, która zostanie wykorzystana z kolei do sprawdzenia, czy coś zostało znalezione: ''[wyrażenie] !== false''. W ten sposób mamy jednocześnie wykonane i sprawdzenie, i pozycję pierwszego wystąpienia w zmiennej ''$id''.
Linia 61:
Nagłówki na stronach internetowych przybierają różne style, w zależności od pełnionych funkcji. Część z nich pisana jest kapitalikami, w innych z dużych liter zaczyna się każdy wyraz. Wcale nie musimy zmuszać redaktorów, by to oni zajmowali się wprowadzaniem tytułów w wymaganej postaci. Istnieją odpowiednie algorytmy, które wykonają to za nich. Choć obecnie zadanie sformatowania tytułów można z powodzeniem zrealizować już z wykorzystaniem CSS-a, PHP posiada szereg funkcji do konwersji dużych liter na małe. Pamiętajmy wszak, że PHP to nie tylko strony internetowe.
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 70:
echo '<p>Każdy wyraz dużymi literami: '.ucwords($tekst).'</p>';
?>
</syntaxhighlight>
</source>
 
Mamy tutaj tekst zapisany w zmiennej (symulującej jakieś źródło danych, ponadto wykorzystamy go kilkakrotnie, stąd ta zmienna) złożony z samych małych liter. Za pomocą funkcji ''strtoupper()'' zamieniamy je wszystkie na duże. Odwrotną operację wykonuje ''strtolower()''. ''ucfirst()'' zamienia na dużą literę początek pierwszego wyrazu ciągu, a ''ucwords()'' - początek każdego wyrazu. Doświadczenie podpowiada nam, że otrzymywane dane nie zawsze są tak klarowne. Jeżeli potrzebne nam automatyczne kapitalizowanie początków zdań, musimy sami napisać odpowiedni algorytm.
Linia 76:
Jeżeli chcemy wyciąć fragment jednego ciągu, aby np. poddać go bardziej szczegółowej obróbce, z pomocą przychodzi nam ''substr()''. Podajemy w niej pozycję, od której zamierzamy ciąć oraz (opcjonalnie) ilość znaków do pobrania. Domyślnie funkcja kończy wycinanie na końcu ciągu. W przykładzie połączymy ją z funkcją ''strpos()'' do wycięcia nazwiska z personaliów pewnego człowieka.
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 93:
?>
</syntaxhighlight>
</source>
 
W personaliach odnajdujemy spację, która posłuży nam jako marker. ''strpos()'' zwróci nam jej pozycję. Przekazujemy ją do ''substr()'' jako punkt startowy wycinania i pobieramy ilość znaków równą długości personaliów minus pozycji spacji. W ten sposób w nasze ręce wpadnie nazwisko i będziemy mogli zrobić z nim, co tylko chcemy. Alternatywny sposób rozwiązania tego problemu polega na rozbiciu tego ciągu na tablicę poznaną już funkcją ''explode()''. Przydaje się on, kiedy oprócz nazwiska pragniemy otrzymać także drugi ciąg z imieniem - tu pasuje ona, jak znalazł.
Linia 99:
Teraz coś bardziej praktycznego. Na wielu witrynach internetowych można spotkać emotikonki zamieniane na obrazki. Jeżeli nie interesują nas żadne dodatkowe fajerwerki, napisanie konwertera jest bajecznie proste. PHP posiada funkcję ''str_replace()'' zamieniającą jeden fragment ciągu na drugi (jej wariant, ''str_ireplace()'' nie rozróżnia wielkości liter).
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 121:
?>
</syntaxhighlight>
</source>
 
Pierwszym parametrem jest szukany ciąg, drugim - ciąg docelowy, a trzecim - ciąg, na którym operujemy. Możemy zdefiniować tylko jeden wzorzec do podmiany albo całą grupę, którą podajemy w postaci tablic, jak na przykładzie. Zwróć uwagę, że w przeciwieństwie do omawianego wcześniej ''substr()'', tutaj ciąg, na którym operujemy, wskazywany jest dopiero na końcu.
Linia 129:
Zajmując się księgą gości, dbaliśmy, aby do naszych wpisów nie przedostał się HTML. Funkcja ''htmlspecialchars()'' zamieniała wtedy znaki specjalne HTML-a na encje, przez co nie mogły być one przetworzone i pojawiały się we wpisie jako statyczny tekst. Okazuje się, że nie jest to jedyne dostępne nam rozwiązanie. Możemy znaczniki wyrzucić całkowicie. Różne warianty prezentuje poniższy przykład:
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 145:
?>
</syntaxhighlight>
</source>
 
Zarówno ''strip_tags()'', jak i ''trim()'' mają pewne ciekawe dodatkowe parametry, o których nie wszyscy wiedzą. Przy wycinaniu znaczników możemy określić, które z nich mają być zostawiane, np. ''strip_tags($tekst, '<nowiki><b><i><u><a></nowiki>')'' pozostawi nam pogrubianie, kursywę, podkreślanie oraz linki. ''trim()'' natomiast niekoniecznie musi wycinać białe znaki - wystarczy, że podamy nasz własny zestaw jako drugi parametr, a możemy oszczędzić sobie dużo pracy.
Linia 154:
PHP udostępnia kilka funkcji ułatwiających pracę z ASCII. Na początku zapoznamy się z funkcjami ''chr()'' oraz ''ord()'' konwertujących kod na odpowiadający mu znak i vice versa. Oto prosty skrypt , wykonujący to zadanie i pobierający dane z formularza HTML.
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 189:
}
?>
</syntaxhighlight>
</source>
 
Formularz przesyła nam dwie informacje:
Linia 209:
Jeśli żądany przez Ciebie zestaw znaków nie jest udostępniany przez żadną z funkcji, możesz skorzystać z odpowiedniego algorytmu:
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 225:
?>
</syntaxhighlight>
</source>
 
Algorytm jest bardzo prosty. Przeszukujemy wprowadzony ciąg znaków ''$ciag'' i sprawdzamy funkcją ''strpos()'', czy każdy jego znak zawiera się w zestawie ''$zestaw''. Jeśli nie, przerywamy pracę i zwracamy '''false'''. Oto przykładowe użycie:
 
<sourcesyntaxhighlight lang="php">echo ctype('555-1234', '0123456789-');</sourcesyntaxhighlight>
 
Jeżeli poszukujesz jeszcze bardziej złożonych związków między znakami, musisz posłużyć się wyrażeniami regularnymi, z których podstawami zaznajomi Cię następny rozdział.
Linia 236:
Korzenie PHP znajdują się w języku C, więc nic dziwnego, że dziedziczy on po nim funkcję ''printf()'' służącą do prezentacji sformatowanych danych.
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 242:
?>
</syntaxhighlight>
</source>
 
Funkcja odnajduje w podanym ciągu specjalne kody formatujące rozpoczynające się od znaku procentu i umieszcza na ich miejscu dane z kolejnych parametrów. W powyższym przykładzie zastosowaliśmy kod ''%x'', który spowoduje wyświetlenie się liczby 3342 w systemie szesnastkowym. Przeglądarka wyświetli zatem:
Linia 250:
Za pomocą kodów formatujących możemy też np. określić precyzję wyświetlania ułamków. Aby wyświetlić liczbę π do 4 miejsc po przecinku, napiszemy:
 
<sourcesyntaxhighlight lang="php">
<?php
Linia 256:
?>
</syntaxhighlight>
</source>
 
To są jedynie podstawy kodów formatujących. Szczegółowy ich opis znajduje się w dokumentacji PHP. Warto nadmienić także istnienie odmian funkcji ''printf()'', np.
Linia 275:
Przypuśćmy, że ''$uzytkownicy'' jest tablicą asocjacyjną taką, że indeks jest nazwą użytkownika, a wartość hasłem zaszyfrowanym w SHA1. Aby sprawdzić, czy użytkownik wpisał poprawne hasło, musimy wykonać następującą czynność:
 
<sourcesyntaxhighlight lang="php">
<?php
 
Linia 288:
 
?>
</syntaxhighlight>
</source>
 
Skonstruowanie systemu autoryzacji wymaga także zaimplementowania mechanizmu sesji, aby przekazać fakt bycia zalogowanym między poszczególnymi żądaniami. Zajmiemy się tym w dalszych rozdziałach.