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.