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

Usunięta treść Dodana treść
To co niżej - kolorowanie składni
Linia 9:
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:
 
<source lang="php">
<nowiki><?php
<?php
$adresy = array(0 =>
Linia 30 ⟶ 31:
}
?>
?></nowiki>
</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:
 
<source lang="php">
<nowiki><?php
<?php
$zrodlo = 'Litwo, ojczyzno moja!';
Linia 48 ⟶ 51:
}
?>
?></nowiki>
</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 59 ⟶ 63:
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.
 
<source lang="php">
<?php
$tekst = 'php jest językiem programowania skryptowego zaprojektowanego dla stron internetowych';
Linia 66 ⟶ 71:
echo '<p>Dużą literą: '.ucfirst($tekst).'</p>';
echo '<p>Każdy wyraz dużymi literami: '.ucwords($tekst).'</p>';
?>
</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 72 ⟶ 78:
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.
 
<source lang="php">
<?php
$nazwa = 'Janusz Kowalski';
Linia 87 ⟶ 94:
echo $nazwisko;
?>
</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 93 ⟶ 101:
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).
 
<source lang="php">
<?php
$post = 'Tak, zaiste jesteś bardzo zdolny :). Jeszcze nad praktyką popracuj :].';
Linia 113 ⟶ 122:
), $post);
?>
</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 121 ⟶ 131:
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:
 
<source lang="php">
<?php
$post = ' To jest post
Linia 135 ⟶ 146:
echo '<p>'.nl2br(strip_tags(trim($post))).'</p>';
?>
</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 144 ⟶ 156:
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.
 
<source lang="php">
<nowiki><?php
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
Linia 177 ⟶ 190:
</form>';
}
?>
?></nowiki>
</source>
 
Formularz przesyła nam dwie informacje:
Linia 197 ⟶ 211:
Jeśli żądany przez Ciebie zestaw znaków nie jest udostępniany przez żadną z funkcji, możesz skorzystać z odpowiedniego algorytmu:
 
<source lang="php">
<nowiki><?php
<?php
function ctype($ciag, $zestaw)
Linia 211 ⟶ 226:
} // end ctype();
?>
?></nowiki>
</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:
 
<source lang="php">echo ctype('555-1234', '0123456789-');</source>
 
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 222 ⟶ 238:
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.
 
<source lang="php">
<nowiki><?php
<?php
printf('Liczba szesnastkowa: %x', 3342);
?>
?></nowiki>
</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 234 ⟶ 252:
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:
 
<source lang="php">
<nowiki><?php
<?php
printf('Liczba PI: %0.4f', M_PI);
?>
?></nowiki>
</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 257 ⟶ 277:
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ść:
 
<source lang="php">
<nowiki><?php
<?php
 
if(isset($uzytkownicy[$_POST['login']]) && $uzytkownicy[$_POST['login']] == sha1($_POST['haslo']))
Linia 268 ⟶ 289:
}
 
?>
?></nowiki>
</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.