webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> kursy online >> kurs php >> Część 9

Wyrażenia regularne

autor: Leszek 'leon' Krupiński, ostatnia modyfikacja: 2007-10-12

szukaj: wyrażenia regularne wyrażenia regularne kurs php kurs php

PHP obsługuje 2 rodzaje wyrażeń regularnych: zgodne ze standardem POSIX (które tu skrótowo opiszę) i te zastosowane w języku Perl (opis tych wyrażeń zostanie tu umieszczony w terminie późniejszym). Wyrażenia regularne są to ciągi znaków, które można dopasować do różnych innych ciągów. Można to porównać do tzw. wildcardów używanych przy operacjach na plikach, gdzie gwiazdka ('*') zastępowała dowolną ilość dowolnych znaków, czyli wyrażenie '*.*' (w przypadku systemów dosowych) będzie pasowało do plików o dowolnej nazwie i dowolnym rozszerzeniu.

Wyrażenia regularne są o wiele bardziej skomplikowane i też działają trochę inaczej. W wildcardach gwiazdka zastępowała dowolną ilość dowolnych znaków, natomiast w wyrażeniach regularnych działa niejako 'wstecz' - opisuje dowolną ilośc powtórzeń (zero lub więcej) poprzedniego znaku, czyli wyrażenie 'a*' będzie pasowało do 'aaa', 'aaaaa' ale i 'b', ponieważ w tym wyrażeniu nie ma ograniczenia że nie może być nic oprócz 'a'. Takie ograniczenie można uzyskać dzięki znakom '^' i '$'. Znak '^' rozumiany jest jako początek linii, a '$' jako koniec.

Tak więc jeśli chcemy znaleźć ciąg, który będzie pusty lub będą w nim same litery 'a', to powinien on wyglądać tak: '^a*$'. Natomiast jeśli 'a' musi wystąpić przynajmniej raz, to zamiast znaku '*' należy użyć znaku '+' - oznacza on jedno lub więcej powtórzeń ostatniego znaku. Istnieje też możliwość użycia znaku '?', który oznacza żadne lub jedno wystąpienie poprzedzającego ten znak atomu, znaku lub zakresu. Można także podać konkretną ilość wystąień znaku, atomu lub przedziału przez użycie za raz po nich nawiasów klamrowych. Jeśli będzie w nich jedna liczba, to będzie ona określała dokładnie daną liczbę powtórzeń. Jeśli będzie w nich liczba a po niej przecinek, to wyrażenie będzie musiało wystąpić przynajmniej tyle razy ile wynosi podana liczba. Istnieje także możliwość podania w nawiasach klamrowych dwóch liczb oddzielonych przecinkiem, co oznacza powtórzenie wyrażenia minimalnie tyle razy ile pierwsza liczba, a maksymalnie tyle ile druga (włącznie).

Zamiast pojedyńczego znaku można podać zakres wyrazów lub całe wyrażenie - tzw. atom. Zakres znaków podaje się w nawiasach kwadratowych. W tych nawiasach można podać pojedyńcze znaki jeden po drugim (np. '[egt]'), przedział liter (np. wszystkie małe litery: '[a-z]' - uwaga, zakres ten nie obejmuje polskich znaków diakratycznych), lub połączenie tych dwóch typów (np. '[a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]' określa wszystkie litery). W nawiasach kwadratowych można podawać także symbole. Jeśli w przedziale potrzebny jest znak myślnika, który normalnie używany jest do określania przedziałów znaków, to trzeba umieścić go na pierwszej lub ostatniej pozycji w nawiasach kwadratowych. W nawiasach kwadratowych znak '^' ma inne znaczenie. Oznacza ono zaprzeczenie, czyli jeśli umieści się je przed znakiem lub zakresem, to ten znak lub zakres nie będzie mógł się pojawić w tym miejscu.

Jeśli znak może być dowolny, to zamiast konkretnej litery, znaku czy przedziału można użyć symbolu kropki ('.'). Przykładowo wyrażenie '^.*$' opisuje dowolny ciąg składający się z dowolnej ilości dowolnych znaków.

Atom, czyli wyrażenie zawarte w nawiasach okrągłych, może zawierać (prawie) dowolną ilość znaków, zakresów i innych atomów. Pozwala to na dopasowywanie powtarzających się fragmentów ciągów znaków. Dobrym przykładem jest sprawdzenie, czy dany ciąg znaków jest ścieżką w systemie uniksowy. Przykładowy ciąg to '/usr/local/bin/php'. Wyrażenie regularne powinno wyglądać tak: '(/([a-Z])+)*(/([a-Z\.]))'. Pierwszy atom określa dowolną ilość katalogów (na początku znak slash a po nim dowolna ilość liter o dowolnej wielkości) po czym nazwa pliku - po atomie nie ma żadnego znaku określającego ilość wystąpień, a więc musi wystąpić dokładnie raz.

Pomiędzy atomami, znakami lub zakresami można postawić znak '|', który oznacza logiczną operację 'OR', czyli poprostu oznacza że może wystąpić jeden lub drugi atom (ten przed znakiem '|' i ten po).

Jeśli w wyrażeniu regularnym musisz podać znak, który byłby interpretowany inaczej niż zamierzamy (np. jeśli musisz znaleźć ciąg zaczynający się od gwiazdki po której jest dowolna ilość liter A, to nie można 'normalnie' podać znaku gwiazdki, ponieważ byłby on interpretowany jako dowolna ilość powtórzeń ostatniego znaku), to należy zamienić ten znak na tzw. 'escape sequence' - poprostu należy przed tym znakiem wstawić znak ukośnika ('\'). Takie znaki to: '(', ')', '[', ']', '{', '}', '\', '*', '|', '^', '$', '?'. Jeśli w wyrażeniu trzeba użyć właśnie znaku ukośnika, to należy wpisać dwa ukośniki, jeden po drugim.

Leszek 'leon' Krupiński

Zagadnienia poruszane w tej części kursu:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org