PHP. Programowanie. Wydanie III

18
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE PHP. Programowanie. Wydanie III Autorzy: Leon Atkinson, Zeev Suraski T³umaczenie: Jaros³aw Dobrzañski ISBN: 83-7361-355-2 Tytu³ orygina³u: Core PHP Programming, 3 Edition Format: B5, stron: 952 Ksi¹¿ka „PHP. Programowanie. Wydanie III” to kolejne wydanie praktycznego przewodnika dla programistów stron internetowych. Jeden z najlepszych programistów PHP — Leon Atkinson, uczy wszystkiego, co potrzebujesz, by stworzyæ dobr¹ i szybk¹ aplikacjê sieciow¹. Dok³adnie opisuje sk³adniê PHP i kluczowe elementy jêzyka. Atkinson przedstawia tak¿e najwa¿niejsze funkcje PHP, w tym funkcje wejcia-wyjcia, przetwarzania danych, matematyczne, daty, czasu, konfiguracji, funkcje umo¿liwiaj¹ce wspó³pracê z bazami danych, funkcje graficzne i sieciowe. Prezentuje on równie¿ dzia³anie PHP na przyk³adach realizuj¹cych sortowanie, przeszukiwanie, analizê ³añcuchów i inne zadania. Ksi¹¿ka sk³ada siê z czterech czêci: 1. wstêpu do programowania, 2. przewodnika po wszystkich funkcjach, 3. przegl¹du typowych problemów programistycznych 4. czêci umo¿liwiaj¹cej zastosowanie zdobytej wiedzy przy tworzeniu witryn. Pierwsza czêæ zajmuje siê kwestiami dotycz¹cymi wszystkich jêzyków programowania: jak wygl¹da skrypt PHP, jak sterowaæ przebiegiem programu i jak zarz¹dzaæ danymi. Czêæ druga organizuje funkcje wed³ug ich zastosowania i zawiera przyk³ady ich zastosowania. PHP udostêpnia bardzo du¿o funkcji, dlatego czêæ ta jest najobszerniejsza. Czêæ trzecia zajmuje siê rozwi¹zywaniem typowych problemów programistycznych, takich jak sortowanie czy generowanie grafiki. Ostatnia czêæ udziela porad dotycz¹cych tworzenia ca³ych witryn sieciowych za pomoc¹ PHP.

description

Doskonały przewodnik po najnowszej wersji języka PHPdla twórców dynamicznych serwisów WWWKsiążka "PHP. Programowanie. Wydanie III" to kolejne wydanie praktycznego przewodnika dla programistów stron internetowych. Jeden z najlepszych programistów PHP -- Leon Atkinson, uczy wszystkiego, co potrzebujesz, by stworzyć dobrą i szybką aplikację sieciową. Dokładnie opisuje składnię PHP i kluczowe elementy języka. Atkinson przedstawia także najważniejsze funkcje PHP, w tym funkcje wejścia-wyjścia, przetwarzania danych, matematyczne, daty, czasu, konfiguracji, funkcje umożliwiające współpracę z bazami danych, funkcje graficzne i sieciowe. Prezentuje on również działanie PHP na przykładach realizujących sortowanie, przeszukiwanie, analizę łańcuchów i inne zadania.Książka składa się z czterech części:* wstępu do programowania,* przewodnika po wszystkich funkcjach,* przeglądu typowych problemów programistycznych* części umożliwiającej zastosowanie zdobytej wiedzy przy tworzeniu witryn.Pierwsza część zajmuje się kwestiami dotyczącymi wszystkich języków programowania: jak wygląda skrypt PHP, jak sterować przebiegiem programu i jak zarządzać danymi.Część druga organizuje funkcje według ich zastosowania i zawiera przykłady ich zastosowania. PHP udostępnia bardzo dużo funkcji, dlatego część ta jest najobszerniejsza.Część trzecia zajmuje się rozwiązywaniem typowych problemów programistycznych, takich jak sortowanie czy generowanie grafiki.Ostatnia część udziela porad dotyczących tworzenia całych witryn sieciowych za pomocą PHP.* Poznaj wzorce projektowe w PHP, techniki programowania obiektowego i możliwości wykorzystania języka XML* Wykorzystaj nowe funkcje i możliwości PHP 5* Napisz wydajne aplikacje internetowe, wykorzystując najlepsze praktyki inżynierii oprogramowania

Transcript of PHP. Programowanie. Wydanie III

Page 1: PHP. Programowanie. Wydanie III

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

PHP. Programowanie.Wydanie IIIAutorzy: Leon Atkinson, Zeev Suraski

T³umaczenie: Jaros³aw Dobrzañski

ISBN: 83-7361-355-2

Tytu³ orygina³u: Core PHP Programming, 3 Edition

Format: B5, stron: 952

Ksi¹¿ka „PHP. Programowanie. Wydanie III” to kolejne wydanie praktycznego

przewodnika dla programistów stron internetowych. Jeden z najlepszych programistów

PHP — Leon Atkinson, uczy wszystkiego, co potrzebujesz, by stworzyæ dobr¹ i szybk¹

aplikacjê sieciow¹. Dok³adnie opisuje sk³adniê PHP i kluczowe elementy jêzyka.

Atkinson przedstawia tak¿e najwa¿niejsze funkcje PHP, w tym funkcje wej�cia-wyj�cia,

przetwarzania danych, matematyczne, daty, czasu, konfiguracji, funkcje umo¿liwiaj¹ce

wspó³pracê z bazami danych, funkcje graficzne i sieciowe. Prezentuje on równie¿

dzia³anie PHP na przyk³adach realizuj¹cych sortowanie, przeszukiwanie, analizê

³añcuchów i inne zadania.

Ksi¹¿ka sk³ada siê z czterech czê�ci:

1. wstêpu do programowania,

2. przewodnika po wszystkich funkcjach,

3. przegl¹du typowych problemów programistycznych

4. czê�ci umo¿liwiaj¹cej zastosowanie zdobytej wiedzy przy tworzeniu witryn.

Pierwsza czê�æ zajmuje siê kwestiami dotycz¹cymi wszystkich jêzyków

programowania: jak wygl¹da skrypt PHP, jak sterowaæ przebiegiem programu

i jak zarz¹dzaæ danymi.

Czê�æ druga organizuje funkcje wed³ug ich zastosowania i zawiera przyk³ady

ich zastosowania. PHP udostêpnia bardzo du¿o funkcji, dlatego czê�æ ta jest

najobszerniejsza.

Czê�æ trzecia zajmuje siê rozwi¹zywaniem typowych problemów

programistycznych, takich jak sortowanie czy generowanie grafiki.

Ostatnia czê�æ udziela porad dotycz¹cych tworzenia ca³ych witryn sieciowych

za pomoc¹ PHP.

Page 2: PHP. Programowanie. Wydanie III

Spis treści

Słowo wstępne............................................................................................................................................. 9

Przedmowa ..................................................................................................................................................11

Część I Programowanie w PHP...........................................................................................13

Rozdział 1. Wprowadzenie do PHP ............................................................................................................. 151.1. Historia PHP ..................................................................................................... 161.2. Co sprawia, że PHP jest lepszy od innych języków? .............................................. 181.3. Interfejsy do systemów zewnętrznych .................................................................. 201.4. Jak PHP współpracuje z serwerem sieciowym?..................................................... 201.5. Wymagania sprzętowe i programowe................................................................... 211.6. Jak wygląda skrypt PHP?.................................................................................... 251.7. Przechowywanie danych ..................................................................................... 271.8. Odbieranie informacji od użytkownika.................................................................. 291.9. Wybieranie pomiędzy alternatywami .................................................................... 311.10. Powtarzanie sekwencji kodu ............................................................................... 32

Rozdział 2. Zmienne, operatory i wyrażenia........................................................................................... 352.1. Spojrzenie ogólne.............................................................................................. 352.2. Typy danych ...................................................................................................... 372.3. Zmienne ........................................................................................................... 402.4. Stałe ................................................................................................................ 452.5. Operatory.......................................................................................................... 452.6. Budowanie wyrażeń ........................................................................................... 57

Rozdział 3. Instrukcje sterujące ...............................................................................................................613.1. Instrukcja if....................................................................................................... 613.2. Operator ? ........................................................................................................ 643.3. Instrukcja switch ............................................................................................... 643.4. Pętle ................................................................................................................ 663.5. Instrukcje exit, die i return ................................................................................. 723.6. Wyjątki ............................................................................................................. 733.7. Instrukcja Declare ............................................................................................. 74

Rozdział 4. Funkcje .................................................................................................................................... 774.1. Deklarowanie funkcji.......................................................................................... 774.2. Instrukcja return................................................................................................ 784.3. Zakres.............................................................................................................. 794.4. Zmienne statyczne ............................................................................................ 814.5. Argumenty ........................................................................................................ 824.6. Rekurencja ....................................................................................................... 854.7. Dynamiczne wywołania funkcji ............................................................................ 86

Page 3: PHP. Programowanie. Wydanie III

4 PHP. Programowanie

Rozdział 5. Tablice...................................................................................................................................... 87

5.1. Tablice jednowymiarowe..................................................................................... 875.2. Indeksowanie tablic........................................................................................... 885.3. Inicjalizacja tablic .............................................................................................. 895.4. Tablice wielowymiarowe ..................................................................................... 905.5. Rzutowanie tablic .............................................................................................. 915.6. Operator + ........................................................................................................ 925.7. Odwołania do tablic z wnętrza łańcucha............................................................... 93

Rozdział 6. Klasy i obiekty......................................................................................................................... 95

6.1. Programowanie obiektowe.................................................................................. 966.2. Model obiektowy w PHP 5 .................................................................................. 976.3. Definiowanie klasy............................................................................................. 986.4. Konstruktory i destruktory ................................................................................ 1006.5. Klonowanie..................................................................................................... 1026.6. Dostęp do metod i właściwości ........................................................................ 1036.7. Statyczne składniki klas................................................................................... 1066.8. Typy dostępności............................................................................................. 1076.9. Wiązanie......................................................................................................... 1116.10. Metody i klasy abstrakcyjne ............................................................................. 1146.11. Przeciążanie z poziomu użytkownika.................................................................. 1176.12. Automatyczne ładowanie klas........................................................................... 1186.13. Serializacja obiektów ....................................................................................... 1196.14. Przestrzenie nazw............................................................................................ 1206.15. Ewolucja modułu Zend ..................................................................................... 122

Rozdział 7. Operacje wejścia-wyjścia i dostęp do dysku......................................................................129

7.1. Połączenia HTTP.............................................................................................. 1307.2. Wysyłanie treści do przeglądarki ....................................................................... 1317.3. Buforowanie treści........................................................................................... 1327.4. Zmienne środowiskowe.................................................................................... 1337.5. Pobieranie danych z formularzy......................................................................... 1337.6. Przesyłanie tablic w formularzach...................................................................... 1347.7. Cookies.......................................................................................................... 1357.8. Pobieranie plików od użytkownika ..................................................................... 1367.9. Zapis do plików i ich odczytywanie .................................................................... 1387.10. Sesje ............................................................................................................. 1407.11. Funkcje include i require .................................................................................. 1427.12. Nie ufaj danym użytkownika ............................................................................. 144

Część II Funkcje PHP ..........................................................................................................145

Rozdział 8. Komunikacja z przeglądarką................................................................................................147

8.1. Zmienne generowane przez moduł PHP ............................................................. 1478.2. Stałe generowane przez moduł PHP .................................................................. 1528.3. Przesyłanie tekstu do przeglądarki .................................................................... 1568.4. Buforowanie wyjścia ........................................................................................ 1598.5. Obsługa sesji .................................................................................................. 1628.6. Nagłówki HTTP ................................................................................................ 169

Page 4: PHP. Programowanie. Wydanie III

Spis treści 5

Rozdział 9. System operacyjny ...............................................................................................................173

9.1. Pliki................................................................................................................ 1739.2. Pliki skompresowane....................................................................................... 2179.3. Direct I/O ....................................................................................................... 2249.4. Diagnostyka.................................................................................................... 2279.5. POSIX............................................................................................................. 2529.6. Polecenia interpretera...................................................................................... 2579.7. Sterowanie procesami ..................................................................................... 262

Rozdział 10. Funkcje sieciowe.................................................................................................................267

10.1. Ogólne funkcje sieciowe................................................................................... 26710.2. Gniazda .......................................................................................................... 27410.3. FTP ................................................................................................................ 28910.4. Curl................................................................................................................ 30010.5. SNMP............................................................................................................. 311

Rozdział 11. Funkcje przetwarzania danych ...........................................................................................315

11.1. Typy danych, stałe i zmienne............................................................................ 31511.2. Tablice ........................................................................................................... 32611.3. Obiekty i klasy................................................................................................. 35711.4. Funkcje definiowane przez użytkownika ............................................................. 361

Rozdział 12. Kodowanie i dekodowanie...................................................................................................367

12.1. Łańcuchy ........................................................................................................ 36712.2. Porównywanie łańcuchów ................................................................................. 37612.3. Kodowanie i dekodowanie................................................................................ 37812.4. Kompresja ...................................................................................................... 40112.5. Szyfrowanie .................................................................................................... 40312.6. Mieszanie....................................................................................................... 41112.7. Sprawdzanie pisowni ....................................................................................... 41612.8. Wyrażenia regularne ........................................................................................ 42012.9. Kodowanie zestawów znaków ........................................................................... 427

Rozdział 13. Funkcje matematyczne .......................................................................................................437

13.1. Operacje matematyczne................................................................................... 43713.2. Liczby losowe.................................................................................................. 44713.3. Liczby dowolnej precyzji.................................................................................... 449

Rozdział 14. Funkcje daty i czasu............................................................................................................453

14.1. Data i czas ..................................................................................................... 45314.2. Niestandardowe kalendarze ............................................................................. 462

Rozdział 15. Konfiguracja PHP.................................................................................................................467

15.1. Dyrektywy konfiguracyjne.................................................................................. 46715.2. Konfiguracja.................................................................................................... 499

Rozdział 16. Funkcje graficzne................................................................................................................509

16.1. Analizowanie obrazów ...................................................................................... 51016.2. Tworzenie obrazków......................................................................................... 513

Page 5: PHP. Programowanie. Wydanie III

6 PHP. Programowanie

Rozdział 17. Bazy danych.........................................................................................................................55717.1. Abstrakcyjna baza danych typu DBM ................................................................. 55817.2. DBX ............................................................................................................... 56217.3. LDAP .............................................................................................................. 56617.4. MySQL ........................................................................................................... 57817.5. ODBC ............................................................................................................. 59117.6. Oracle ............................................................................................................ 60617.7. Postgres......................................................................................................... 62017.8. Sybase ........................................................................................................... 637

Rozdział 18. Warstwy obiektowe............................................................................................................64718.1. COM............................................................................................................... 64718.2. CORBA ........................................................................................................... 65218.3. Java ............................................................................................................... 654

Rozdział 19. Inne funkcje .........................................................................................................................65719.1. Apache........................................................................................................... 65719.2. IMAP .............................................................................................................. 66019.3. MnoGoSearch ................................................................................................. 68119.4. OpenSSL ........................................................................................................ 68619.5. Komunikaty systemu System V......................................................................... 69619.6. Semafory systemu System V ............................................................................ 70019.7. Pamięć wspólna systemu System V .................................................................. 702

Rozdział 20. XML......................................................................................................................................70720.1. DOM XML ....................................................................................................... 70920.2. Expat XML ...................................................................................................... 72220.3. WDDX............................................................................................................. 733

Część III Algorytmy...........................................................................................................737

Rozdział 21. Sortowanie, wyszukiwanie i liczby losowe ......................................................................73921.1. Sortowanie ..................................................................................................... 74021.2. Wbudowane funkcje sortujące .......................................................................... 74021.3. Sortowanie z funkcją porównującą .................................................................... 74421.4. Wyszukiwanie.................................................................................................. 74621.5. Indeksowanie.................................................................................................. 74821.6. Liczby losowe.................................................................................................. 74921.7. Identyfikatory losowe ....................................................................................... 75121.8. Losowanie banera reklamowego ....................................................................... 752

Rozdział 22. Analiza składni i łańcuchów...............................................................................................75522.1. Podział łańcuchów na elementy ........................................................................ 75522.2. Wyrażenia regularne ........................................................................................ 75722.3. Definiowanie wyrażeń regularnych..................................................................... 75822.4. Stosowanie wyrażeń regularnych w skryptach PHP.............................................. 759

Rozdział 23. Integracja z bazami danych ..............................................................................................76723.1. Tworzenie tabel HTML z rezultatami zapytań SQL ............................................... 76723.2. Śledzenie odwiedzających za pomocą identyfikatorów sesji................................. 77223.3. Przechowywanie danych w bazie ....................................................................... 78023.4. Warstwy abstrakcyjne baz danych ..................................................................... 786

Page 6: PHP. Programowanie. Wydanie III

Spis treści 7

Rozdział 24. Sieć ......................................................................................................................................787

24.1. Uwierzytelnianie w HTTP................................................................................... 78724.2. Sterowanie buforem przeglądarki ...................................................................... 79024.3. Ustawianie typu dokumentu ............................................................................. 79124.4. E-mail z załącznikami ....................................................................................... 79224.5. Wiadomości pocztowe HTML ............................................................................ 79524.6. Weryfikacja adresu skrzynki pocztowej .............................................................. 798

Rozdział 25. Generowanie grafiki ..........................................................................................................803

25.1. Przyciski dynamiczne ....................................................................................... 80325.2. Generowanie grafiki „w locie”........................................................................... 80825.3. Wykresy słupkowe ........................................................................................... 80825.4. Wykresy kołowe............................................................................................... 81125.5. Rozciąganie pojedynczych pikseli ...................................................................... 813

Część IV Inżynieria oprogramowania..............................................................................815

Rozdział 26. Integracja z HTML-em .........................................................................................................817

26.1. Umieszczanie fragmentów kodu PHP w dokumencie HTML.................................. 81726.2. Używanie PHP do generowania całych dokumentów HTML................................... 82326.3. Separowanie HTML-a od PHP ........................................................................... 82426.4. Generowanie kodu HTML za pomocą PHP.......................................................... 826

Rozdział 27. Projektowanie ....................................................................................................................829

27.1. Tworzenie specyfikacji wymagań ....................................................................... 83027.2. Tworzenie dokumentów projektowych ................................................................ 83327.3. Zarządzanie zmianami ..................................................................................... 83427.4. Modularyzacja za pomocą include..................................................................... 83927.5. FreeEnergy...................................................................................................... 84027.6. Szablony......................................................................................................... 84227.7. Szkielety aplikacji ............................................................................................ 84627.8. PEAR.............................................................................................................. 84727.9. Adresy przyjazne wyszukiwarkom ...................................................................... 848

Rozdział 28. Efektywność i diagnostyka.................................................................................................851

28.1. Optymalizacja.................................................................................................. 85228.2. Mierzenie wydajności ....................................................................................... 85328.3. Optymalizacja najwolniej wykonywanych fragmentów........................................... 85728.4. Kiedy przechowywać treść w bazie .................................................................... 85928.5. Strategie diagnostyczne ................................................................................... 85928.6. Symulowanie połączeń HTTP ............................................................................ 86028.7. Buforowanie treści strony................................................................................. 86128.8. Kompresja generowanej treści.......................................................................... 86228.9. Unikanie eval .................................................................................................. 86328.10. Unikanie dynamicznego ładowania rozszerzeń.................................................... 86528.11. Zwiększanie szybkości realizacji zapytań MySQL ................................................ 86628.12. Optymalizacja sesji zapisujących dane na dysku ................................................ 86728.13. Unikanie przekazywania argumentów przez odwołania

(czyli dlaczego nie ufać instynktowi) .................................................................. 86828.14. Unikanie konkatenacji dużych łańcuchów........................................................... 87028.15. Unikanie umieszczania dużych plików na serwerze Apache z uaktywnionym PHP... 871

Page 7: PHP. Programowanie. Wydanie III

8 PHP. Programowanie

28.16. Rola trwałych połączeń z bazą danych ............................................................... 87128.17. Unikanie w miarę możliwości korzystania z exec, operatorów ` i system............... 87228.18. Zastosowanie php.ini-recommended ................................................................. 87328.19. Stosowanie wyrażeń regularnych tylko tam, gdzie są niezbędne........................... 87328.20. Optymalizacja pętli .......................................................................................... 87328.21. Konfiguracja serwera IIS .................................................................................. 874

Rozdział 29. Wzorce projektowe ...........................................................................................................875

29.1. Definicja wzorców............................................................................................ 87529.2. Singleton ........................................................................................................ 87729.3. Fabryka .......................................................................................................... 88029.4. Obserwator ..................................................................................................... 88229.5. Strategia ........................................................................................................ 885

Dodatki ...............................................................................................................................889

Dodatek A Kody z ukośnikiem ..................................................................................................................891

Dodatek B Kody ASCII ...............................................................................................................................893

Dodatek C Operatory ...............................................................................................................................899

Dodatek D Znaczniki PHP ..........................................................................................................................901

Dodatek E Konfiguracja PHP w czasie kompilacji..................................................................................903

Dodatek F Zasoby internetowe ...............................................................................................................907

Dodatek G Przewodnik po stylach PHP...................................................................................................909

Skorowidz .................................................................................................................................................913

Page 8: PHP. Programowanie. Wydanie III

Analiza składni i łańcuchów

W tym rozdziale:

� Podział łańcuchów na elementy.

� Wyrażenia regularne.

� Definiowanie wyrażeń regularnych.

� Stosowanie wyrażeń regularnych w skryptach PHP.

Analiza składni polega na podziale całości na elementy składowe, zwykle dotyczy to podziałuzdania na poszczególne wyrazy. PHP musi zanalizować napisany przez nas kod w pierw-szym kroku procesu przekształcania go w dokument HTML. Czasami staniemy równieżprzed problemem pobierania i weryfikacji danych zawartych w łańcuchach tekstowych. Możeto być np. prosta lista oddzielona tabulatorami lub skomplikowany łańcuch, jakiego przeglą-darka używa do swojej identyfikacji w obliczu serwera sieciowego. Można wówczas podzie-lić łańcuch na poszczególne elementy lub zastosować wyrażenie regularne. W rozdzialetym opisane zostały funkcje analizujące składnię oraz treść łańcuchów.

22.1. Podział łańcuchów na elementy

PHP udostępnia prosty model dzielenia łańcuchów. Wybrane przez nas znaki są uznawaneza separatory, a fragmenty łańcucha, znajdujące się między separatorami, są uznawane zapojedyncze elementy. Z każdym pobranym elementem można zmieniać zestaw znaków sepa-rujących, co jest wygodne w przypadku nieregularnych łańcuchów — to znaczy tych, którenie są prostymi listami oddzielonymi przecinkami.

Listing 22.1 pobiera zdanie i dzieli je na poszczególne słowa za pomocą funkcji ������,opisanej w rozdziale 12. W przypadku skryptu słowa są otoczone spacjami, znakami prze-stankowymi lub końca zdania. Cudzysłowy i apostrofy są uznawane za część wyrazu. Efektdziałania przykładowego skryptu jest widoczny na rysunku 22.1.

Page 9: PHP. Programowanie. Wydanie III

756 Część III � Algorytmy

Listing 22.1. Podział łańcucha na elementy

����������������������� ����������������������������������������������������� !"#!$%&'����(')**����+��������������,-.

��������� ����/�012 �����������3��01/*.��������� ����/+�� !"#!$%&'����(')4�0 15��0 15�/*.

��������������������������6 ���� ��7�����(��6����8������9(�(�������������� ��� ��,�/��:;�/.

������������0� ���������<���������8������������� �������,��� ������ !"#!$%&'����(')������ ��� �*.������������������:,,�=>?$!.������������������,��� �������� ��� �**��������+����������������8����������8������������������������:,�//*������������+���������������������(���<���7��������������<� ��6<�������������������:������<� ��(����&�� ����< ������*)**����������������+���������������������<� ��(����&�� ����< ������*),@.����������������4����������������������������������+���������������������<� ��(����&�� ����< ������*)AA.����������������4����������������������AA.������������4��������4

����������<��� <����������B(���� ����<���C�8���6<����������� ���<� ��(����*.

��������������C������ ����<���C�8�(�C���B(��<���C��<������������� �� ���<� ��(����*.

��������� ����/�01D�������������������6<��015�/*.��������� ����/���15�/*.���������� �(���<� ��(�����������,1�E���*��������+������������� ����/���1������E���*����15�/*.��������4��������� ����/����15�/*.����4

����� ����/��� 8��(����,5/+��$! F! &'2G2�$!?=')45/�/�;��������/8����,5/����5/15�/*.����� ����/���������8,5/����(5/����,5/H-5/15�/*.����� ����/����������,5/��08��5/�E���,5/>�������5/15�/*.����� ����/���� 815�/*.�1

Page 10: PHP. Programowanie. Wydanie III

Rozdział 22. � Analiza składni i łańcuchów 757

Rysunek 22.1.Efekt działania skryptuz listingu 22.1

Warto zwrócić uwagę na rolę pętli ��� w powyższym przykładzie. Zamiast inkrementacjiwartości całkowitej pobiera ona kolejne elementy łańcucha. Kiedy funkcja ������ trafi nakoniec danych wejściowych, zwróci ���. Pierwszą myślą może być sprawdzanie w pętliwystąpienia wartości ��� za pomocą operatora � . Należy pamiętać, że pusty łańcuch mawartość logiczną ���. Jeżeli dwa separatory następują po sobie, ������, jak można sięspodziewać, zwróci pusty łańcuch. Ponieważ nie chcemy, aby operacja dzielenia łańcuchazostała przerwana na pierwszym powtórzonym separatorze, konieczne jest sprawdzenie wy-stąpienia rzeczywistej wartości ��� za pomocą operatora � .

Funkcja ������ jest użyteczna tylko w najprostszych i najbardziej uporządkowanych przypad-kach. Przykładem może być odczyt pliku tekstowego, separowanego tabulatorami. Algo-rytm polegać może wówczas na odczycie wiersza z pliku, podziale wiersza na elementy,stosując tabulator w roli separatora i przejściu do odczytu kolejnego wiersza z pliku.

22.2. Wyrażenia regularneNa szczęście PHP udostępnia również o wiele doskonalsze narzędzie niż funkcja ������— wyrażenia regularne. Używają one własnego języka do opisu wzorców, które są porów-nywane z łańcuchami. Kod źródłowy PHP zawiera implementację wyrażeń regularnychzgodnych z normą POSIX 1003.2. Norma ta umożliwia stosowanie wyrażeń starszego typu,ale sugeruje korzystanie z nowego typu, który zostanie tu opisany. Wszystkie funkcje zwią-zane z wyrażeniami regularnymi są opisane w rozdziale 12.

W 1999 r. Andrei Zmievski wzbogacił PHP o współpracę z wyrażeniami regularnymi, stoso-wanymi w języku Perl. Mają one dwie zalety w stosunku do wbudowanych wyrażeń regu-larnych PHP: ułatwiają kopiowanie wyrażeń ze skryptów Perl i wykonują się szybciej.

Dokładny opis wyrażeń regularnych wykracza poza ramy tego tekstu. Jest to zagadnieniegodne następnej książki. Zostaną tu objaśnione podstawy oraz pokazane różne funkcjePHP, które używają wyrażeń regularnych. Świetnym źródłem informacji o wyrażeniach regu-

Page 11: PHP. Programowanie. Wydanie III

758 Część III � Algorytmy

larnych jest rozdział 2. książki Ellie Quigley, UNIX Shells by Example. Wyrażenia regularnestosowane w Perlu są opisane w oficjalnej dokumentacji Perla pod adresem http://www.perldoc.com/perl5.8.0/pod/perlre.html. Następnie należy przeczytać w dokumentacji na stronie PHPo różnicach między implementacją tych wyrażeń w Perlu a w PHP: http://www.php.net/manual/�pcre.pattern.syntax.php.

22.3. Definiowanie wyrażeń regularnych

Na najwyższym poziomie wyrażenia regularne składają się z jednej lub więcej gałęzi, oddzielo-nych znakiem pionowej kreski (�). Znak ten ma właściwości operatora logicznego ��.Każda z gałęzi może odpowiadać testowanemu łańcuchowi. Kilka przykładów znajduje sięw tabeli 22.1.

Tabela 22.1. Warianty w wyrażeniach regularnych

Próbka Opis

��0��� Odpowiada słowu „jabłko”.

��0���I����� Odpowiada słowu „jabłko” lub „piłka”.

��(�7��I����(I� � <� Odpowiada słowom „początek”, „koniec” lub „przerwa”.

Każdy z wariantów zawiera jeden lub więcej atomów. Po atomach mogą występować znakimodyfikujące możliwą liczbę kolejnych trafień dla danego atomu. Gwiazdka (�) oznacza,że atom może występować dowolną liczbę razy. Symbol dodawania (�) oznacza, że atommusi występować przynajmniej raz. Znak zapytania (�) oznacza, że atom może występo-wać raz lub ani razu.

Alternatywnie atom może być związany, co oznacza, że następują po nim nawiasy klamrowe(��), które zawierają liczby całkowite. Jeżeli nawiasy klamrowe zawierają pojedynczą liczbę,wówczas atom musi występować dokładnie tę liczbę razy. Jeżeli w nawiasach znajduje siępojedyncza liczba, po której następuje przecinek, atom musi występować tyle lub więcejrazy. Jeżeli klamry zawierają dwie liczby oddzielone przecinkiem, atom musi występowaćliczbę razy zawartą w przedziale między tymi liczbami. W tabeli 22.2 przedstawione sąprzykłady repetycji.

Tabela 22.2. Wzorce z repetycją w wyrażeniach regularnych

Próbka Opis

��0�* Odpowiada �, �0, �00, … — znak � plus dowolna liczba znaków 0;

��0A* Odpowiada �0, �00, �000, … — znak � plus jeden lub więcej znaków 0;

��0�* Odpowiada � lub �0 — znak �, po którym może wystąpić znak 0;

��0+J4* Odpowiada tylko �000;

��0+K�4* Odpowiada �00, �000, �0000, … — znak �, po którym następuje jeden lub więcej znaków 0;

��0+K�H4* Odpowiada �00, �000, �0000 — znak �, po którym następują dwa, trzy lub cztery znaki 0;

Page 12: PHP. Programowanie. Wydanie III

Rozdział 22. � Analiza składni i łańcuchów 759

Atom jest szeregiem znaków, z których niektóre mają specjalne znaczenie, a inne oznaczająpo prostu znak, który ma występować w łańcuchu. Kropka (�) zastępuje dowolny pojedynczyznak. Karetka (�) zastępuje początek łańcucha. Symbol dolara (�) zastępuje koniec łańcucha.Jeżeli w łańcuchu ma występować jeden ze znaków specjalnych (�������������������������),należy je poprzedzić znakiem �. Tak naprawdę każdy znak poprzedzony znakiem � będzietraktowany dosłownie, nawet jeżeli nie ma on specjalnego znaczenia. Każdy znak nieposia-dający specjalnego znaczenia zostanie uznany po prostu za znak, który ma występowaćw łańcuchu. Można również grupować atomy za pomocą nawiasów, aby były traktowanejako jeden atom.

Nawiasy kwadratowe (��) służą do określania możliwego zakresu wartości. Może on miećformę listy dozwolonych znaków lub zakresu określonego za pomocą myślnika ( ). Jeżelilista lub zakres są poprzedzone karetką (�), oznacza to wszystkie znaki spoza określonegozakresu. Należy zwrócić uwagę na to podwójne znaczenie znaku �.

Oprócz list i zakresów nawiasy kwadratowe mogą zawierać klasy znaków. Nazwy tych klassą dodatkowo otoczone dwukropkami, aby odpowiadać wszystkim znakom należącym doalfabetu �!"#$%"!�. Dostępne klasy to: "#&'(, "#$%", )#"&�, *&��#, +,-,�, -�"$%, #�./�,$�,&�, $'&*�, �$"*/, '$$/� i 0+,-,�. Opisy tych klas znajdują się w dokumentacji *�1$/.

Oprócz tego, dwa dodatkowe kody w nawiasach kwadratowych określają początek lub koniecwyrazu. Są to odpowiednio �!2!� i �!�!�. Wyraz oznacza w tym przypadku każdą sekwencjęznaków alfanumerycznych i znaków podkreślenia. Tabela 22.3 zawiera przykłady użycianawiasów kwadratowych.

Tabela 22.3. Nawiasy kwadratowe w wyrażeniach regularnych

Próbka Opis

�;( Odpowiada ��(, �0(, �((, … — każdy trzyliterowy łańcuch zaczynający się na �, a kończący na (;

L�;� Odpowiada każdemu łańcuchowi rozpoczynającemu się na literę �;

&�M()�N� Odpowiada N, �N, 0N, �0�N, �0(N — dowolny ciąg złożony z pierwszych trzech liter alfabetu,

po których następuje N;

0&��)� Odpowiada wyrazom 0�� lub 0��;

&LO�)+P4 Odpowiada każdemu łańcuchowi o długości 5 znaków, który nie zawiera małego lub dużego �;

&&3�����3)) Odpowiada każdej cyfrze, równoważnik wyrażenia &-MQ);

&&3�3))�;� Odpowiada każdemu wyrazowi, który zaczyna się na �;

22.4. Stosowanie wyrażeń regularnych

w skryptach PHP

Podstawową funkcją do wykonywania wyrażeń regularnych jest /�/-. Funkcja ta testujełańcuch na danym wyrażeniu regularnym, zwracając 34��, jeżeli wzorzec opisany w wyra-żeniu regularnym występuje w testowanym łańcuchu. W ten sposób można sprawdzić, czy

Page 13: PHP. Programowanie. Wydanie III

760 Część III � Algorytmy

łańcuch posiada określoną formę. Przykładem może być kontrola poprawności formatu kodupocztowego, składającego się z dwóch cyfr, po których następują myślnik i trzy cyfry. Pokazujeto listing 22.2. Efekt dziania przykładowego skryptu widać na rysunku 22.2.

Listing 22.2. Sprawdzanie kodu pocztowego

������������������$� �<������� �<��BR��� 8�����������(���<����������� ��������� �<�����(��������(�7���������8���(���<�8���������6 �������<�7��<��(�� ��������6 �(��8������<�R���C��7(�������������������� ���(�� �;������

������������������ ��������������������������������������������������� !"#!$%&'���')**����+����������� ��/L�&-MQ)+K4*�M&-MQ)+J4*��/���� !"#!$%&'���')**��������+������������� ����/+�� !"#!$%&'���')4������� �<���������(���<�;�0 15�/*.��������4������������������+������������� ����/+�� !"#!$%&'���')4��01����01�/�;����������������/������� �<��8����8���(���<�8;�0 15�/*.��������4����4

�������<� ����� 8��� ������ ����/��� 8��(����,5/+��$! F! &'2G2�$!?=')45/15�/*.����� ����/����������,5/�N�5/���8,5/���5/15�/*.����� ����/����������,5/��08��5/�E���,5/$� �<�S5/15�/*.����� ����/���� 815�/*.�1

Rysunek 22.2.Efekt działania skryptuz listingu 22.2

Skrypt udostępnia formularz do wprowadzania kodu pocztowego. Musi on składać się z dwóchcyfr, po których następują myślnik i kolejne trzy cyfry. Działanie tego skryptu opiera się nanastępującym wyrażeniu regularnym:

L�&-MQ+K4*�M&-MQ)+J4*��

Do niego porównywane są informacje wprowadzone przez użytkownika. Pomocna będzie tudokładna analiza wyrażenia.

Page 14: PHP. Programowanie. Wydanie III

Rozdział 22. � Analiza składni i łańcuchów 761

Rozpoczyna się ono od karetki. Powoduje to szukanie trafień tylko od początku łańcucha.Jeżeli karetka zostałaby pominięta, kod pocztowy mógłby rozpoczynać się dowolną liczbąznaków, np. ")*56 789 i wciąż być zgodny z wyrażeniem regularnym. W podobny sposóbznak dolara na końcu wyrażenia powoduje szukanie trafień od końca łańcucha. Zapobiega totrafieniom, takim jak 75 :;:")*+. Kombinacja karetki i znaku dolara umożliwia wybieraniełańcuchów zawierających tylko wymagane znaki.

Pierwsze podwyrażenie to ��; <��6��. Zakres w nawiasach kwadratowych pozwala na sto-sowanie tylko cyfr z zakresu od 0 do 9. Zawartość nawiasów klamrowych informuje, że cy-fry muszą być dokładnie dwie.

Drugie podwyrażenie to � �; <��=���. W podobny sposób, jak w pierwszym wyrażeniu,określona została tu liczba cyfr na 3. Myślnik ma tu znaczenie dosłowne i musi poprzedzać3 kolejne cyfry. Znak zapytania informuje, że całe podwyrażenie musi występować tylkoraz lub w ogóle, co czyni podanie kolejnych trzech cyfr opcjonalnym.

W prosty sposób można przebudować takie wyrażenie, aby sprawdzało numery telefonówi daty. Wyrażenia regularne zapewniają świetny sposób kontroli wartości zmiennych zwra-canych poprzez formularze. Zastępują one zagnieżdżone instrukcje ,� i przeszukiwaniełańcuchów funkcją ���$��.

Można również sprawić, aby trafienia dotyczące poszczególnych podwyrażeń zostały zwróconew tabeli. Jest to użyteczne w sytuacjach, kiedy trzeba podzielić łańcuch na części. Dobrymprzykładem dla tej metody jest łańcuch, którym identyfikuje się przeglądarka. W łańcuchutym zakodowane są: nazwa przeglądarki, wersja i typ komputera, na którym została uru-chomiona. Pobranie tych informacji do oddzielnych zmiennych umożliwi dostosowaniestrony do możliwości danej przeglądarki.

Listing 22.3 przedstawia skrypt, tworzący zestaw zmiennych, które pomagają ukryć stronędla określonego typu przeglądarki. Dla przykładu uzależnimy zawartość hiperłącza od typuprzeglądarki. Jeżeli użytkownik korzysta z Netscape Navigatora, łącze będzie wskazywałona stronę, z której można pobrać Microsoft Explorera. W innym wypadku łącze będziewskazywało stronę, z której można pobrać Netscape Navigatora. Jest to przykład dostoso-wywania zawartości strony. Tą samą metodą można decydować również o użyciu zaawan-sowanych możliwości strony.

Listing 22.3. Sprawdzanie http_user_agent

������������� �<�������������� ���7�� ����� �����������<�����������;�T�������H;-��(�8����0�.�T$U!�V;-.�W����<��X%�P;@.�"J@KHV@*���� ��/L�&&3�����3))A*��&&3�����3)5;)A*��;�*�/�����������$! F! &'G%%2�#$! �>Y!X%')���8��(�*.

�����0 �<� X�8�,��8��(�&@).�����0 �<� F �����,��8��(�&K).�����0 �<� Z�( �������,��8��(�&J).

��������������<��6<���������� ���7�� ������T$U!������� ���/8��/���0 �<� Z�( ������**����+����������������(���B�<������3�����������(�8����0�.�T$U!�V;-.�W����<��X%�P;@.�"J@KHV@*�������� ���/T$U!��&&3�����3)5;)A*./�

Page 15: PHP. Programowanie. Wydanie III

762 Część III � Algorytmy

���������0 �<� Z�( ���������8��(�*.

���������0 �<� X�8�,�/T$U!/.���������0 �<� F �����,��8��(�&@).����4

����� ����/[� ����������� ���7�� ����0 �<� X�8�/�;��������/< �����0 �<� F ����:�0 15�/�;��������/T������ 60�<�R� 6<������ �����R���� ���7�� ��3�/*.

������� ���/8������/���0 �<� X�8**����+��������� ����/���� �,5//�;������������/����3��<<<;8�( �����;(�8�����<������������;���5/1/*.��������� ����/U�� ���!N��� /*.��������� ����/���1�/*.����4����������+��������� ����/���� �,5//�;������������/����3��<<<;���(��;(�8�(�8���������<���������N;��8�/�;�/5/1/*.��������� ����/X�E����� /*.��������� ����/���1�/*.����4����� ����/������ 6<�����;�0 15�/*.�1

Główna funkcja /�/- w skrypcie jest użyta bez warunku ,�. Zakłada ona, że przeglądarkadokona swojej identyfikacji co najmniej w postaci podania nazwy, ukośnika i numeru wersji.Tablicy ("�*% zostają przyporządkowane części rozpatrywanego łańcucha, które odpowiadajączęściom wyrażenia regularnego. Wyrażenie to składa się z trzech podwyrażeń, odpowia-dających nazwie, wersji i wszystkim pozostałym charakterystykom. Forma ta jest stosowanaprzez większość przeglądarek, w tym Navigatora i Internet Explorera. Jako że Internet Explorerzawsze identyfikuje się jako przeglądarka Mozilla (Netscape), należy wykonać dodatkowekroki, aby określić, czy przeglądarka jest rzeczywiście produktem Netscape, czy go tylkoudaje. Odpowiada za to wywołanie /�/-,.

Dlaczego element zerowy tablicy jest pomijany? Otóż przechowuje on podciąg, który zostałtrafiony przez całe wyrażenie regularne. W omawianej sytuacji trafienia takie nie mają zna-czenia. Zwykle element zerowy okazuje się przydatny, gdy poszukujemy określonego łańcucha,zawartego w ramach szerszego kontekstu. Przykładem może być przeszukiwanie treści stronyw poszukiwaniu URL-u. Listing 22.4 pobiera stronę domową PHP i tworzy listę wszystkichłączy znajdujących się na tej stronie. Efekt działania jest widoczny na rysunku 22.3.

Listing 22.4. Poszukiwanie adresów URL na stronie

������������� ��# ?������0 ���������6<�����# ?�,�/����3��<<<;���;���/.

��������<� ���������������,�������# ?��/ /*.

����� ����/?���������� �����# ?�0 15�/*.����� ����/���15�/*.

Page 16: PHP. Programowanie. Wydanie III

Rozdział 22. � Analiza składni i łańcuchów 763

Rysunek 22.3.Efekt działania skryptuz listingu 22.4

����<����:��������**����+������������0� ��<� ���������������,������������@-KH*.

����������<��������C����������0(���7����(������B��������������<���� ���/� �,5/&L5/)�5//���������8��(�**��������+��������������<�B<������� ���# ?������������� ����/���1+�8��(�&-)4����15�/*.

�����������������<���� ��# ?���<� ���������������� ���(�,� �� ���(�/5�/��/5�/���8��(�&-)*.�����������������,� �� ���(�� ���(��//������*.��������4����4����� ����/����15�/*.

�����(��������*.�1

Page 17: PHP. Programowanie. Wydanie III

764 Część III � Algorytmy

Główna pętla skryptu pobiera wiersze tekstu ze strumienia pliku i szuka właściwości %�/�.Jeżeli właściwość taka zostanie znaleziona w wierszu, jest on umieszczany w zerowym ele-mencie tablicy ("�*%. Następnie skrypt wyświetla zawartość tego elementu i usuwa go z wierszaza pomocą funkcji /�/->�/$#"*/. Funkcja ta zamienia tekst pasujący do wyrażenia regular-nego na dany łańcuch. W tym przypadku właściwość ?4�� zostaje zastąpiona łańcuchempustym. Powodem usunięcia łącza po jego odnalezieniu jest możliwość znalezienia dwóchłączy w jednym wierszu kodu HTML. Funkcja /�/- trafi wówczas tylko pierwszy podciąg.Rozwiązaniem jest odnalezienie i usunięcie wszystkich łączy.

Jak widać, w chwili usuwania łącza tworzona jest zmienna �/$#"*/. Niektóre łącza mogązawierać znak zapytania — dopuszczalny znak w URL-u, który oddziela nazwę pliku odzmiennych formularza. Jako że znak ten ma specjalne znaczenie w wyrażeniach regularnych,skrypt umieszcza przed nim znak �, aby umożliwić jego dosłowną interpretację.

Często używam funkcji /�/->�/$#"*/ do konwersji treści na potrzeby nowego kontekstu.Można na przykład zastosować /�/->�/$#"*/ do zastąpienia kilku spacji jedną. Pokazuje tolisting 22.5. Efekt działania skryptu z listingu widać na rysunku 22.4.

Listing 22.5. Zamiana powielonych spacji

����������������������� ������������������������������������������ !"#!$%&'�N�')**����+��������� ����/�01X����� �<�����01�0 15�/�;������������/�� 1+�� !"#!$%&'�N�')4��� 1/�;������������/�0 15�/*.

�������������� !"#!$%&'�N�')�,� �� ���(�/&&3���(3))A/�������������/�/���� !"#!$%&'�N�')*.

��������� ����/�01=��� �<�����01�0 15�/�;������������/�� 1+�� !"#!$%&'�N�')4��� 1/�;������������/�0 15�/*.����4����������+���������� !"#!$%&'�N�')�,�//.����4

�������<� ����� 8��� ������ ����/��� 8��(����,5/+��$! F! &'2G2�$!?=')45/15�/�;��������/��N�� ����8,5/�N�5/�(���,5/H-5/� �<�,5/@-5/1/�;��������/+�� !"#!$%&'�N�')4���N�� �1�0 15�/�;��������/����������,5/��08��5/�E���,5/W�B���5/15�/�;��������/���� 815�/*.�1

Page 18: PHP. Programowanie. Wydanie III

Rozdział 22. � Analiza składni i łańcuchów 765

Rysunek 22.4.Efekt działania skryptuz listingu 22.5