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

Usunięta treść Dodana treść
Zyx (dyskusja | edycje)
utworzenie
 
Zyx (dyskusja | edycje)
Linia 53:
 
=== Modyfikacja ciągów ===
Zajmiemy się teraz dosyć rozległą kwestią modyfikacji oraz obróbki tekstu. Jest ona niezwykle ważna, jeżeli zamierzasz pisać aplikacjetypu forum dyskusyjnego czy księgi gości. Z wiadomych przyczyn nigdy nie powinniśmy zezwolić internaucie na wypisywanie wszystkiego, co mu się podoba i musimy poddać jego tekst elektronicznej obróbce. Za jej pomocą można również ułatwiać formatowanie tekstu. Przykładowo, treść źródłowa tego podręcznika zapisana jest w specjalnym zestawie znaczników dostosowanym do specyfiki Wikibooks. Odpowiednia biblioteka zajmuje się jego przetwarzaniem na język HTML. Tak złożonymi kwestiami nie będziemy się tu jednak zajmować. Wspomniane zostaną przede wszystkim te funkcje dostępne w PHP. Bardziej zaawansowane algorytmy musisz już zaprogramować samodzielnie.
 
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.
 
<nowiki><?php
$tekst = 'php jest językiem programowania skryptowego zaprojektowanego dla stron internetowych';
echo '<p>Kapitaliki: '.strtoupper($tekst).'</p>';
echo '<p>Z dużej litery: '.ucfirst($tekst).'</p>';
echo '<p>Każdy wyraz z dużych liter: '.ucwords($tekst).'</p>';
?></nowiki>
 
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.
 
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 ilość znaków do pobrania. W przykładzie połączymy ją z funkcjami ''strpos()'' oraz ''strlen()'' (podaje długość ciągu) do wycięcia nazwiska z personaliów pewnego człowieka.
 
<nowiki><?php
$nazwa = 'Janusz Kowalski';
if(($id = strpos($nazwa, ' ')) !== false)
{
$nazwisko = substr($nazwa, $id, strlen($nazwa) - $id);
}
else
{
$nazwisko = '';
}
echo $nazwisko;
?></nowiki>
 
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ł.
 
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).
 
<nowiki><?php
$post = 'Tak, zaiste jesteś bardzo zdolny :). Jeszcze nad praktyką popracuj :].';
// Pierwszy sposób zamiany
echo '<p>'.str_replace(':)', '<img src="smile.gif"/>', $post).'</p>';
// Drugi, kilka naraz
echo '<p>'.str_replace(array(
':)',
':]',
':('
), array(
'<img src="smile.gif"/>',
'<img src="eye.gif"/>',
'<img src="sad.gif"/>'
), $post);
?></nowiki>
 
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.
 
{{Infobox|tekst=Miejsce podawania danych, na których funkcja ma operować, nie jest ujednolicone. Część funkcji wymaga jego podania na końcu, a część na końcu. Jest to pozostałość po pionierskich czasach rozwoju PHP tworzonego wtedy po części metodą pospolitego ruszenia, oraz ówczesnych inspiracjach językiem C.}}
 
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:
 
<nowiki><?php
$post = ' To jest post
kilkulinijkowy. Który należy przerobić tak,
aby go <b>fajnie wyświetlać</b>';
// Wariant 1
echo '<p>'.nl2br(htmlspecialchars(trim($post))).'</p>';
// Wariant 2
echo '<p>'.nl2br(strip_tags(trim($post))).'</p>';
?></nowiki>
 
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.
 
=== Formatowanie tekstu ===