PHP - skorowidz funkcji wykorzystujących wyrażenia regularne

Stronę tą wyświetlono już: 372 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.

Listing 1
  1. 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:

[abc]- oznacza wystąpienie jednego znaku, który musi pasować do tych wymienionych pomiędzy nawiasami kwadratowymi;
[^abc] - oznacza wystąpienie jednego znaku, którym nie może być żaden z wymienionych po znaku ^;
[a-z] - pojedyncza litera od a do z (tylko literki małe i bez polskich znaków diakrytycznych);
[A-Z] - pojedyncza litera od A do Z (tylko literki duże i bez polskich znaków diakrytycznych);
[a-zA-Z] - pojedyncza literka z zakresu od a do z bez względu na wielkość i bez polskich znaków diakrytycznych);
^ - oznacza początek tekstu przeszukiwanego gdy użyte jest na początku wyrażenia regularnego;
$ - oznacza koniec tekstu przeszukiwanego, gdy jest użyte na końcu wyrażenia regularnego;
\A - oznacza początek tekstu;
\z - oznacza koniec tekstu;
. - oznacza pojedynczy dowolny znak;
\s - każdy pojedynczy biały znak;
\S - każdy pojedynczy nie biały znak;
\d - każda pojedyncza cyfra;
\D - każdy pojedynczy niecyfrowy;
\w - każda pojedyncza litera, numer lub znak podkreślenia;
\W - każdy pojedynczy znak nie będący literą, numerem lub znakiem podkreślenia;
\b- oznacza granicę tekst, którą są znaki białe;
(...) - oznacza podciąg wyrażenia regularnego, który również zostanie wyciągnięty z jego całości i zwrócony przez funkcję;
(a|b) - oznacza a lub b;
a? - oznacza wystąpienie literki a zero lub jeden raz;
a* - oznacza wystąpienie literki a zero lub więcej razy;
a+ - oznacza wystąpienie literki a co najmniej jeden raz;
a{3} - trzykrotne wystąpienie a;
a{3,} - trzy lub więcej razy występująca literka a;
a{3,6} - trzy do sześciu razy występująca literka a;

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.

Listing 2
  1. 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ę.

Listing 3
  1. int eregi( string $pattern , string $tekst [, array &$regs ] )

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

Listing 4
  1. 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.

Listing 5
  1. 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.

Listing 6
  1. 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.

Listing 7
  1. 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.

Listing 8
  1. 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

Listing 9
  1. 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:

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

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:

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

Powyższy kod zwróci:

  • 01-466
  • 01
  • 466

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.

Listing 12
  1. 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:

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

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

  • 01-466
  • 01-447
  • 01
  • 01
  • 466
  • 447

Listing 14
  1. 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:

Listing 15
  1. $tekst = "ul. Bredzisława Komoruskiego 16 01-466 Warszawa; ul. Donalda Tłuka 3 01-447 Warszawa";
  2. $pattern = '/([0-9]{2})[ ]*-[ ]*([0-9]{3})/';
  3. $replacement = '${1} $2';
  4. 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

Listing 16
  1. 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:

Listing 17
  1. $tekst = "data1 data2;data3 data4";
  2. $table = preg_split("/;| /",$tekst);
  3. foreach($table as $i){
  4. echo('<p>' . $i . "</p>");
  5. }

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

  • data1
  • data2
  • data3
  • data4

Listing 18
  1. 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:

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

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

Komentarze