Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3759 razy

Wyrażenia regularne

Wyrażeniem regularnym nazywa się wzór, który w jednoznaczny sposób opisuje pewien określony warunkowo poszukiwany wzór tekstu w tekście. Dzięki wyrażeniom regularnym można w łatwy i elastyczny sposób odnaleźć w dość złożonym tekście fragment lub fragmenty tekstu pasujące do tego wyrażenia regularnego za pomocą jednej funkcji. Wyrażenia regularne stosowane są w PHP, Perl-u, a także w Shellu tudzież Bash-u związanym z pisaniem skryptów konsolowych.

Bardzo prosty przykład skryptu konsolowego dla systemów UNIX-owych, który wykorzystuje wyrażenia regularne jest taki oto skrypt wyszukujący pliki pasujące do wzorca A*.jpg oznaczającego plik o nazwie zaczynającej się na literę A i mający rozszerzenie .jpg.

for i in *.jpg; do echo "$i"; done

Powyższy kod wyświetli na ekranie komputera wszystkie pliki z bieżącej lokalizacji konsoli, które pasują do podanego wzorca (wyrażenia regularnego).

Definiowanie wzorców regularnych w PHP wykorzystuje pewne zbiory znaków specjalnych, które nie mogą w wzorcach tekstowych w sposób bezpośredni występować. Do takich znaków specjalnych należą: . + * ? [ ^ ] $ ( ) { } = ! < > | : - . Jeżeli zaistnieje potrzeba wstawienia któregoś z wcześniej wymienionych znaków specjalnych jako części tekstu, w takim przypadku konieczne jest zastosowanie znacznika /.

Poniżej zamieszczam tabelkę opisującą w przybliżony sposób elementy składowe wyrażeń regularnych:

Przestarzałe funkcje PHP wykorzystujące wyrażenia regularne

W PHP występuje jeszcze seria przestarzałych funkcji operujących na wyrażeniach regularnych, które postanowiłem tutaj wymienić po kolei.

int ereg( string $pattern , string $tekst [, array &$regs ] )

Funkcja, która zwraca false, gdy nie wykryto żadnego wzorca w zmiennej $tekst pasującej do wyrażenia regularnego z z zmiennej $pattern, w przeciwnym razie zwraca liczbę znalezionych wyrażeń w tekście.

Opcjonalnie funkcja zwraca przez rekurencję wszystkie znalezione dopasowania do zmiennej $regs jako tablicę.

int eregi( string $pattern , string $tekst [, array &$regs ] )

Odpowiednik poprzedniej funkcji, który nie zwraca uwagi na wielkość liter.

string ereg_replace( string $pattern , string $replacement , string $string )

Funkcja zamienia tekst z zmiennej $string pasujący do wzorca podanego w zmiennej $patern i zastępuje go wyrażeniem z zmiennej $replacement.

string eregi_replace( string $pattern , string $replacement , string $tekst )

Funkcja, która wykonuje to samo co poprzednia z tą tylko różnicą, że nie zwraca przy tym uwagi na wielkość liter.

array split( string $pattern , string $tekst [, int $limit = -1 ] )

Funkcja dzieląca tekst w miejscach wystąpienia podtekstu pasującego do wzorca z zmiennej $pattern i zwracająca podzielony tekst w formie tablicy.

array spliti( string $pattern , string $tekst [, int $limit = -1 ] )

Funkcja działająca jak poprzednia, z tą tylko różnicą, że nie zwraca ona uwagi na wielkość liter w tekście.

string sql_regcase( string $tekst )

Funkcja stara się utworzyć poprawne wyrażenie regularne, definiujące w jednoznaczny sposób tekst z zmiennej $tekst.

Najnowsze funkcje PHP wykorzystujące wyrażenia regularne

int preg_match( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

Funkcja zwraca fałsz, gdy nie znaleziono żadnego dopasowania wyrażenia regularnego z zmiennej $pattern w zmiennej $subject, w przeciwnym razie liczbę uzyskanych dopasowań.

Do zmiennej opcjonalnej $matches funkcja zwraca w postaci tablicy wszystkie uzyskane dopasowania.

Przykłady:

$tekst = "ul. Bredzisława Komoruskiego 16 01-466 Warszawa; ul. Donalda Tłuka 3 01-447 Warszawa"; if(preg_match("/[0-9]{2}[ ]*-[ ]*[0-9]{3}/",$tekst,$matches)){ foreach($matches as $match){ echo('<p>' . $match . '</p>'); } }

Powyższy kod zwróci wartość 01-446, ponieważ wewnątrz wyrażenia regularnego nie wyróżniono pod wyrażeń za pomocą nawiasów () w sposób pokazany w poniższym przykładzie:

$tekst = "ul. Bredzisława Komoruskiego 16 01-466 Warszawa; ul. Donalda Tłuka 3 01-447 Warszawa"; if(preg_match("/b([0-9]{2})[ ]*-[ ]*([0-9]{3})b/",$tekst,$matches)){ foreach($matches as $match){ echo('<p>' . $match . '</p>'); } }

Powyższy kod zwróci:

Warto zauważyć, że funkcja skupiła swoje działanie tylko i wyłącznie na pierwszym wystąpieniu znalezionego wzorca pasującego do wyrażenia regularnego z zmiennej $pattern.

int preg_match_all( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

Funkcja ta w odróżnieniu od preg_match wyszukuje wszystkie możliwe wystąpienia tekstu pasującego do wyrażenia regularnego znajdującego się w zmiennej $pattern. Dopasowania mogą zostać zwrócone w postaci tablicy do zmiennej $matches, z tą różnicą względem poprzedniej funkcji, że tutaj tablica ta jest podwójna, gdzie w zerowym indeksie zapisywane są główne znalezione dopasowania a w kolejnych pośrednie wyróżnione za pomocą nawiasów ().

Przykład:

$tekst = "ul. Bredzisława Komoruskiego 16 01-466 Warszawa; ul. Donalda Tłuka 3 01-447 Warszawa"; if(preg_match_all("/b([0-9]{2})[ ]*-[ ]*([0-9]{3})b/",$tekst,$matches)){ foreach($matches as $match){ foreach($match as $mmatch){ echo('<p>' . $mmatch . '</p>'); } } }

Powyższy przykład wyświetli następujący tekst:

mixed preg_replace( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

Umożliwia zamianę fragmentu tekstu pasującego do wyrażenia regularnego opisanego w zmiennej $pattern i zamienia je według wzorca z zmiennej $replacement.

Przykład:

$tekst = "ul. Bredzisława Komoruskiego 16 01-466 Warszawa; ul. Donalda Tłuka 3 01-447 Warszawa"; $pattern = '/([0-9]{2})[ ]*-[ ]*([0-9]{3})/'; $replacement = '${1} $2'; echo preg_replace($pattern, $replacement, $tekst);

Powyższy kod zwraca: ul. Bredzisława Komoruskiego 16 01 466 Warszawa; ul. Donalda Tłuka 3 01 447 Warszawa

array preg_split( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

Funkcja ta dzieli podany tekst z zmiennej $subject w miejscu tekstu pasującego do wzorca z zmiennej $pattern

Przykład:

$tekst = "data1 data2;data3 data4"; $table = preg_split("/;| /",$tekst); foreach($table as $i){ echo('<p>' . $i . "</p>"); }

Powyższy kod zwróci (jak nie trudno się domyślić):

string preg_quote( string $str [, string $delimiter = NULL ] )

Funkcja zamienia wszystkie wystąpienia znaków specjalnych . + * ? [ ^ ] $ ( ) { } = ! < > | : - na takie, które odpowiadają znakom tekstowym w wyrażeniu regularnym.

Przykład:

$tekst = ". + * ? [ ^ ] $ ( ) { } = ! < > | : -"; echo(preg_quote($tekst));

Powyższy kod zwróci: . + * ? [ ^ ] $ ( ) { } = ! < > | : -