W PHP można znaleźć wiele funkcji, dzięki którym możemy wyciągać fragmenty łańcucha znaków lub liczb. Aby móc się nimi sprawnie posługiwać potrzebna jest znajomość wzorców.
Są to znaki specjalne (tzw. metaznaki), które mają odpowiednią wartość w każdym z przypadków. Dla przykładu przyjrzyj się funkcji ereg(). Posiada ona trzy argumenty. Pierwszy z nich to właśnie odpowiedni wzorzec, do którego mają być dopasowywane elementy przetrzymywane w zmiennej określonej jako drugi argument. Trzeci parametr jest opcjonalny – tzn. nie trzeba go stosować – i jeśli chcesz go użyć to podajesz w nim nazwę tablicy, w której będą przechowywane pasujące do wzorca dane. W celu lepszego zrozumienia przedstawię to na prostym przykładzie:
$ciag = ‘to jest tekst, który zawiera przecinek!’; ereg(‘,’, $ciag, $tablica); |
Teraz tablica ‘$tablica’ przechowuje wszystkie wystąpienia pasujące do wzorca, w tym wypadku wszystkie wystąpienia przecinka.
To był jeden z prostszych przykładów, który nie zawierał konkretnych wzorców, a jedynie wyszukiwał konkretnego znaku. Ten sam przykład można rozbudować o bardziej zaawansowane wyszukiwanie. Zanim jednak do tego przejdziemy przedstawię opis wszystkich znaków specjalnych wykorzystywanych we wzorcach.
Na początek przedstawię znaki, które mają szczególne znaczenie w sporządzaniu wzorców i jeśli chcemy aby były traktowane dosłownie, należy poprzedzić je znakiem lewego ukośnika. Są to znaki:
. * ? + [ ] ( ) { } ^ $ | \ |
Wzorce zapewniają pewien sposób określania wzorców. Jeśli pewien ciąg znaków podamy między dwoma nawiasami kwadratowymi (np. ‘[abc]’) to oznacza to, że do wzorca może pasować jeden z tych trzech znaków, ale nie wszystkie naraz. Podobne rozwiązanie jest kiedy chcemy stwierdzić, które znaki nie mogą pasować do wzorca. W tym celu w po otwarciu nawiasu kwadratowego należy wstawić znak ‘^’, a potem dopiero ciągi znaków lub cyfr, np. ‘[^abc]’. Do tak skonstruowanego wzorca pasują wszystkie ciągi, które nie zawierają ‘a’, ‘b’ lub ‘c’. Załóżmy jednak, że w nawiasie chcemy wymienić wszystkie cyfry bądź wszystkie znaki alfabetu. Ich wypisywanie może być męczące, dlatego do dyspozycji mamy znak myślnika (‘-‘), który używany jest do ustawiania zakresu, np. ‘[0-9]’ jest równoważny zapisowi ‘[0123456789]’. Prawda, że łatwiejszy jest pierwszy zapis. To samo zagadnienie dotyczy znaków alfabetu. Jednocześnie w jednym nawiasie możemy korzystać z kilku zakresów, np. ‘[a-zA-Z]’ zawiera wszystkie małe i duże znaki alfabetu.
Wiesz już odszukiwać pojedyncze znaki za pomocą nawiasów kwadratowych, ale co jeśli potrzebujesz znaleźć ciąg znaków, np. układający się w jakiś wyraz. Do tego posłużą nam nawiasy okrągłe (zwykłe). Zawarte między nimi dane są dopasowywane w całości, np. ‘(piłka)’ pasuje do wszystkich wystąpień słowa ‘piłka’ napisanego małymi literami.
Przejdźmy teraz do kolejnego problemu, który dotyczy miejsca rozpoczęcia i zakończenia wyszukiwania znaków. Do tej pory wszystkie wzorce wyszukiwały danych w dowolnym miejscu ciągu. Jeśli chcemy, np. aby wzorzec rozpoznał dane znajdujące się na początku ciągu musisz użyć znaku ‘^’ na samym początku wzorca, np. ‘^(abc)’. Natomiast jeśli chcesz rozpoznać dane które znajdują się na końcu ciągu, to na końcu wzorca musisz wstawić znak ‘$’, np. ‘(abc)$’. Ten sposób wyszukiwania danych nazywany jest kotwiczeniem.
Pora na naukę zastosowania operatorów alternatywy, czyli wyboru między dopasowywanymi wzorcami. Stosuje się w tym celu bitowy odpowiednik operatora ‘or’, czyli znak ‘|’, np. ‘(raz|dwa|trzy)’. W ten sposób wzorzec dopasuje jeden z tych ciągów.
Następnym bardzo często stosowanym typem znaków specjalnych są kwalifikatory, które definiują ile razy mogą występować podane znaki. Wyróżniamy trzy kwalifikatory: ‘+’, ‘*’ i ‘?’. Pierwszy z nich określa, że poprzedni znak musi wystąpić co najmniej jeden raz lub więcej. Drugi stwierdza, że poprzedni znak może wystąpić raz lub więcej, lub w ogóle może nie występować. Trzeci ostatni typ określa, że poprzedni znak może istnieć raz lub ani razu. Każdy z tych operatorów znajduje osobne zastosowanie. Trudno tu przytoczyć konkretny problem, ale na pewno nie będzie trudno ich dopasować. Wystarczy tylko chwilkę się zastanowić.
Ostatnim rozważanym typem wzorców są kwantyfikatory, czyli wyrażenia, które określają ilość wystąpienia znaków po kolei. Ich stosowanie nie jest trudne, gdyż przedział ten oznacza się w nawiasach klamrowych oddzielając początek przedziału od końca przecinkiem, np. ‘a{1, 4}’. Dzięki tej konstrukcji zdefiniowaliśmy, że litera ‘a’ ma wystąpić od 1 do 4 razy po kolei. Możemy także stwierdzić konkretnie ile razy ma wystąpić dany znak podając w nawiasach jedną liczbę, np. ‘a{2}’. Jeśli chcemy, żeby dany znak wystąpił daną ilość razy lub więcej to stosujemy konstrukcję ‘a{2,}’, a jeśli chcemy, żeby wystąpił daną ilość razy lub mniej to stosujemy konstrukcję ‘a{,4}’. To także nie jest trudne do opanowania.
Skoro znasz już sposoby wzorcowania danych, to teraz już wiesz dlaczego wymienione na początku znaki specjalne w przypadku dosłownego znaczenia trzeba poprzedzać znakiem lewego ukośnika.
Teraz podsumuję jeszcze stworzone specjalne znaki, które ułatwiają korzystanie ze wzorców:
\d – znak jest cyfrą, odpowiada wzorcowi ‘[0-9]’ \D – znak nie jest cyfrą, odpowiada wzorcowi ‘[^0-9]’ \w – znak jest znakiem słowa, odpowiada wzorcowi ‘[a-zA-Z0-9]’ \W – znak nie jest znakiem słowa, odpowiada wzorcowi ‘[^a-zA-Z0-9]’ \s – znak jest znakiem odstępu, odpowiada wzorcowi ‘[ \t\n\r]’ \S – znak nie jest znakiem odstępu, odpowiada wzorcowi ‘[^ \t\n\r]’ \b – znak granicy między znakiem \w i \W . – dowolny znak oprócz nowej linii |
Teraz znasz już wszystkie rodzaje wzorców, więc mogę przejść do sporządzenia krótkiego przykładu tłumaczącego zastosowanie tych wzorców.
Na początek skonstruuje prosty wzorzec, który sprawdza poprawność adresu e-mail. W tym celu stworze tablice, która będzie zawierać przykładowe adresy e-mail do porównania.
$mail[0] = ‘[email protected]’; $mail[1] = ‘alias @domena.pl’; $mail[2] = ‘alias @ domena.pl’; $mail[3] = ‘[email protected]’; $mail[4] = ‘alias-alias@dom_ena.com.pl’; |
Teraz skonstruuje sam skrypt do sprawdzania poprawności adresu:
for ($i=0; $i < count($mail); $i++) { print “Adres <b>$mail[$i]</b> jest ”; if (ereg(„^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-\.]+$”, $mail[$i])) { print “poprawny!<br>\n”; } else { print “niepoprawny!<br>\n”; } } |
Prawda, że nie jest to trudne. Prosta pętla porównuje każdy element tablicy i sprawdza czy jest poprawny, po czym wyświetlają odpowiednią informacje.
Teraz kolej na coś trudniejszego. Może teraz zbudujemy skrypt, który sprawdzi poprawność adresu URL ?? A więc najpierw zbudujmy tak jak w poprzednim przykładnie tablice z przykładowymi danymi:
$url[0] = ‘;; $url[1] = ‘;; $url[2] = ‘ ena.pl’; $url[3] = ‘;; $url[4] = ‘;; $url[5] = ‘ index.htm’; $url[6] = ‘;; |
Kod do sprawdzenia poprawności zamieszczam poniżej:
for ($i=0; $i < count($url); $i++) { print “URL <b>$url[$i]</b> jest ”; if (ereg(„^[^ ]+://[^ ]+\.[^ ]+$”, $url[$i])) { print “poprawny!<br>\n”; } else { print “niepoprawny!<br>\n”; } } |
Jak zapewne widzisz oba kody, zarówno przy porównaniu adresu e-mail jak i URL są podobne, z tą tylko różnicą, że zawierają inne wzorce i nazwy tablicy z danymi.
Stosowanie wzorców ma duże znaczenie w PHP, więc jeśli opanujesz tą sztukę na pewno nie będziesz miał problemów z tworzeniem dobrze zabezpieczonych aplikacji.