Podstawy użycia wyrażeń regularnych
Wyrażeń regularnych używamy nie tylko w kodowaniu językiem PHP. Na potrzeby naszych przykładów, użyjemy tego języka skryptowego 😉
Znajomość tych wyrażeń w prosty sposób umożliwia walidowanie danych, które są wprowadzane do formularza. Podstawą tego jest możliwość przeszukiwania ciągów znaków wg odpowiedniej regułki i porównywania ze wzorcem. Takie możliwości umożliwiają nam szereg innych działań, które stają się dostępne w kilku linijkach kodu.
Ponieważ wyrażenia regularne mają swoją własną składnię kodu, opisujemy to w poniższej tabelce:
Znaczenie symboli:
. | użycie kropki oznajmia, że szukamy dowolnego znaku jednak nie będącego znakiem nowej linii
Przykład: .a. (pasuje do: „rar, rak, kat”) |
* | gwiazdkę stawiamy po znaku który ma wystąpić wielokrotnie lub wcale (jeśli stoi po nawiasie to dotyczy zawartości tego nawiasu)
Przykład: amo* (pasuje do: „am, amo, amooooooooo, amoooo”) |
+ | plus ma podobne działanie jak kropka z tym wyjątkiem, że poprzedzający go element musi wystąpić przynajmniej jeden raz
Przykład: amo+ (pasuje do: ” amo, amooooooooo, amoooo”)Może też wprowadzić do wyrażenia działanie jednokrotne (bez nawrotów) Przykład: amo++oooo (NIE pasuje do: ” amo, amooooooooo, amoooo”)amo*+ amo?+
|
? | znak zapytania ogranicza występienie poprzedzającego elementu do jednego wystąpienia lub wcale
Przykład: am? (pasuje do: ” a, am”)Może także wprowadzić do wyrażenia zachowanie leniwe Przykład: *? zero lub więcej wystąpień leniwe+? jedno lub więcej wystąpień leniwe?? zero lub jedno wystąpienie leniweTo może jeszcze odwrócić FLAGA na końcu wyrażenia U |
{min,max} | w nawiasach klamrowych możemy określić ilość razy wystąpienia poprzedzającego elementu. Przykładowo {2,3} określi, że element musi wystąpić przynajmniej dwa razy ale nie wiecej jak trzy razy
Przykład: ame{2,3} (pasuje do: „amee, ameee”) minimum to dwa wystąpienia a max trzyame{3} dokładnie trzy wystąpieniaame{2,} minimum to dwa wystąpienia, bez maximumame{,2} maximum to dwa wystąpienia, bez minimumame{2,3}? znak ? określi wyrażenie leniweame{2,3}+ znak + określi by było bez nawrotów |
\ | tym ukośnikiem można przywrócić znakom specjalnym ich zwykłe literały, np.\? będzie zwykłym znakiem zapytania |
^ | tego znaku używamy na samym początku aby określić od czego ma zaczynać się poszukiwanie, choć to nie jest konieczne. Natomiast użycie tego na początku w nawiasach kwadratowych [ ] neguje to co po nim jest określone w tym nawiasie. Przykład: [^23] oznacza wszystkie znaki poza cyframi 2 lub 3.
Przykład: [^amo]* (NIE będzie pasować do wyrazów zawierajacych choćby raz jedną z liter: „a, m, o”) |
$ | ten znak stawiamy na końcu celem określenia czym ma się zakończyć przeszukiwany warunek |
[ ] |
w nawiasach kwadratowych wpisujemy znaki jakie mogą wystapić lub ich grupy. Przykładowo jak mają wystąpić tylko cyfry to wpiszemy [0-9]
Przykład: [0-9a] (pasuje do: „4312, 000, 2222222, a, 452345a”) |
| | działa jak LUB. Przykład: (a|b) określa, że ma wystąpić litera a lub b ale nie obie. Dokładniej chodzi o to, że wybierze jedno z nich, te które wystąpi pierwsze
Przykład: (a|b) (ze słów: „aaaaa, abbbbbbb, amooooooooo, amoooo” wybierze tylko literę „a”) |
\w | skrót dla [a-zA-Z0-9_] czyli powiedzmy wszystkie znaki alfanumeryczne i podkreślenie |
\W | to jest negacja powyższego czyli skrót dla [^a-zA-Z0-9_] |
\d | określa liczbę czyli skrót dla [0-9] |
\D | to jest negacja powyższego czyli skrót dla [^0-9] |
\n | określa nową linie |
\t | określa znak tabulacji |
\s | dowolny biały znak (specjalny) |
\S | negacja powyższego, czyli wszystkie znaki oprócz białych |
i | FLAGA – (znajduje się na końcu wyrażenia) określa brak wrażliwości na wielkość liter |
U | FLAGA – wyłącza zachłanność wyrażenia (pierwsze dopasowanie jest brane pod uwagę) |
g | FLAGA – wyszukuje w całym stringu (w PHP domyślnie włączone) |
s | FLAGA – znak kropi bierze także wystąpienie nowej linii (\n\r) |
m | FLAGA – przeszukiwanie nastąpi linia po linii (znaki końca i początku ^$ określają początek i koniec każdej z linii) |
x | FLAGA – ignorowanie białych znaków (wyrażenie obejmuje komentarze zaczynające się #) |
u | FLAGA – kodowanie w UTF-8 |
A | FLAGA – wymuszenie by znak ^ początku pasował tylko początku napisu |
D | FLAGA – wymuszenie by znak $ końca pasował tylko do końca napisu |
^\d{2}-\d{3}$ sprawdzi poprawność kodu pocztowego ( dwie cydry, po nich znak myslnika i trzy cyfry ) |
|
^k.*[^w]a$ to wyrażenie dopasuje do słów zaczynających się na literę k i kończących na literę a. Jednak z wyjątkiem, kiedy przedostatnia litera to w (czyli kawa NIE spełnia tego wyrażenia, ale spełnia koala) |
|
[abc]{3} wyrażennie określa ciąg znaków składający siez trzech liter (a,b,c). Ciąg ten może mieć długość tylko trzy. Czyli pasuje do: aaa, bbb, ccc, abc, bba… |
|
^.7.{3}(9.{3}){2}$ wyrażenie zaczyna siedowolnym znakiem, po nim ma wystąpić cyfra siedem. Następnie dokładnie trzy dowolne znaki. Następnie w nawiasie określona dziewiątka i po niej trzy dowolne znaki. A to co w nawiasie musi wystąpić dwa razy. |
|
[ ] |
A teraz kilka przykładów wykorzystania wyrażeń w praktyce
Tu mamy przykład wyszukania wszystkich adresów url z tekstu:
1 2 |
preg_match_all('/<a.*href=\"([^\"]*)\".*>(.*)<\/a>/iU', $tekst, $tablica); |
Wyszukiwanie oczywiście w zmiennej tekst zostaje zapisane w tablicy tablica. Na kuńsu dwie falagi inforumją, że wyrażenia ma być niewrażliwe na wielkość liter i leniwe.