Wyrażenia regularne PHP
Czym są wyrażenie regularne ?
Zapraszam do publikacji, dotyczącej najpotężniejszego narzędzia do przetwarzania i manipulacji tekstu oraz cyfr w języku programowania PHP.
Funkcje PHP dla wyrażeń regularnych.
Wyrażenia regularne, powszechnie znane jako "regex" lub "RegExp", to specjalnie sformatowane ciągi tekstowe służące do znajdowania wzorów w tekście. Wyrażenia regularne to jedno z najpotężniejszych dostępnych obecnie narzędzi do efektywnego i wydajnego przetwarzania tekstu oraz cyfr i manipulacji nimi. Na przykład można go użyć do sprawdzenia, czy format danych, tj. imię i nazwisko, adres e-mail, numer telefonu itd. Wprowadzony przez użytkownika był prawidłowy czy nie, znaleźć lub zastąpić pasujący ciąg w treści tekstowej, wyszukać wartości liczbowe w elementach tekstowych i na odwrót ( sic! wartości liczbowe można również przestawić jako litery np. system szesnastkowy - heksadecymalny ), itd.
Sama idea wyrażeń regularnych pozwala na świetną współpracę z bazami danych. Pozwala na szybkie znajdowanie w tablicach asocjacyjnych ( wielowymiarowych ) w PHP a następnie dowolne sortowanie, uzupłnianie, modyfikacje lub wyszukiwanie dowolnej treści.
PHP ( wersja od 5.3 do 7.x.xx ) obsługuje wyrażenia regularne w stylu Perla za pośrednictwem rodziny funkcji preg_
Dlaczego wyrażeń regularnych w stylu Perla ?
Ponieważ Perl ( Practical Extraction and Report Language ) był pierwszym głównym językiem programowania, który zapewniał zintegrowaną obsługę wyrażeń regularnych i jest dobrze znany ze swojej zaawansowanej obsługi wyrażeń regularnych i niezwykłych możliwości przetwarzania i manipulowania tekstem oraz liczbami.
Najczęściej używane funkcje preg_ wbudowane w PHP
preg_match() - Wykonaj dopasowanie do wyrażenia regularnego. *
preg_match_all - Wykonaj globalne dopasowanie wyrażenia regularnego.
preg_replace() - Wykonaj wyszukiwanie wyrażenia regularnego i zastąp.
preg_grep() - Zwraca elementy tablicy wejściowej, która pasowała do wzorca.
preg_split() - Dzieli łańcuch na tablicę za pomocą wyrażenia regularnego.
preg_quote() - Zacytuj wyrażenia regularne znalezione w ciągu znaków.
- * Funkcja PHP preg_match() przestaje wyszukiwać po znalezieniu pierwszego dopasowania, podczas gdy funkcja preg_match_all() kontynuuje wyszukiwanie do końca ciągu i znajduje wszystkie możliwe dopasowania, zamiast zatrzymywać się przy pierwszym dopasowaniu.
Składnia wyrażeń regularnych
Składnia wyrażeń regularnych obejmuje użycie znaków specjalnych ( nie mylić ze znakami specjalnymi HTML - encje ). Znaki, które mają znaczenie w wyrażeniach regularnych, to:
. * ? + [ ] ( ) { } ^ $ | \
Będziesz musiał odwrócić ukośnik znaków, gdy chcesz ich użyć dosłownie. Na przykład, jeśli chcesz dopasować ".", musisz napisać "\." Wszystkie pozostałe zanaki automatycznie przyjmują swoje dosłowne znaczenie.
Wskazówka: Wyrażenia regularne znajdziemy również w innych językach programowaniach niż. PHP.
Języki tj. Java, Perl, Python używają takich samych wzorców do wyszukiwania.
Różne opcje formułowania wzorów dla wyrażeń regularnych:
1.0 Klasy znaków - informacje PHP
- 1.1 Przykład funkcji preg_match()
- 1.2 Przykład funkcji preg_match_all()
- 1.3 Przykład funkcji preg_match()
2.0 Predefiniowane klasy znaków.
3.0 Liczniki powtórzeń
- 3.1 Przykład funkcji preg_split() dla wyrażenia /[\s,]+/
- 3.2 Przykład funkcji preg_split() dla wyrażenia /[\s,]/ - brak znaku plus
- 3.3 Przykład funkcji preg_split() dla wyrażenia /[\s]+/ - brak znaku przecinek
4.0 Kotwice
5.0 Modyfikatory wzorów
6.0 Granice słów
7.0 Przykłady wyrażeń regularnych w praktyce
8.0 Podsumowanie - wszystkie klasy
- 8.1 Klasy znaków.
- 8.2 Predefiniowane klasy znaków.
- 8.3 Liczniki powtórzeń.
- 8.4 Kotwice.
- 8.5 Modyfikatory wzorów.
1.0 Klasy znaków.
Nawiasy kwadratowe otaczające wzór znaków nazywane są klasą znaków np. [abc]. Klasa znaków zawsze pasuje do pojedynczego znaku z listy określonych znaków, co oznacza, że wyrażenie [abc] pasuje tylko do znaku a, b lub c.
Można także zdefiniować negowane klasy znaków, które pasują do dowolnego znaku, z wyjątkiem tych zawartych w nawiasach. Negowana klasa znaków jest definiowana przez umieszczenie symbolu daszka (^) bezpośrednio za nawiasem otwierającym, w ten sposób [^abc]. Wynikiem będzie każdy inny znak niż a, b lub c.
Możesz także zdefiniować zakres znaków za pomocą znaku łącznika (-) wewnątrz klasy znaków, na przykład [0-9].
Kilka przykładów klas:
[abc] - Pasuje do którejkolwiek z liter a, b lub c.
[^abc] - Pasuje do dowolnego znaku innego niż a, b lub c.
[a-z] - Pasuje do dowolnego znaku od małej litery a do małej litery z.
[A-Z] - Pasuje do dowolnego znaku od wielkiej litery A do wielkiej litery Z.
[a-Z] - Pasuje do dowolnego znaku od małej litery ado dużej litery Z.
[0-9] - Pasuje do pojedynczej cyfry od 0 do 9.
[a-z0-9] - Pasuje do pojedynczego znaku od małej litery a do dużej litery z lub od cyfry 0 do 9.
Przykład 1.1
Poniższy przykład pokazuje, jak znaleźć wzór w ciągu znaków używając wyrażenia regularnego i funkcji preg_match() w PHP.
<?php
$wzor_regexp = "/ka[wn]a/";
$zdanie = "...na biurku ułóżono stos kartek, długopis, kalkulator oraz duży kubek kawy z napisem - kawa poranna. Mieszkanie było kawalerką o dużym metrażu z dużą kanapą...";
if(preg_match($wzor_regexp, $zdanie)){
echo "Znaleziono dopasowania!";
} else{
echo "Nie znaleziono dopasowania.";
}
?>
Wynik skryptu PHP:
Znaleziono dopasowania!
- Funkcja PHP znalazła dopasowanie wzoru regexp="/ka[wn]a/" w zdaniu, dotyczy pierwszego słowa kawa i zakończyła wyszukiwanie z efektem TRUE.
Jednak zdanie zawiera więcej wyrazów określonych w wzorze regexp, który jasno określa ciąg znków tj. ...kawa... lub ...kana...
Przykład 1.2
Podobnie można użyć funkcji preg_match_all(), aby znaleźć ilość wszystkich dopasowań w zdaniu.
<?php
$wzor_regexp = "/ka[wn]a/";
$zdanie = "...na biurku ułóżono stos kartek, długopis, kalkulator oraz duży kubek kawy z napisem - kawa poranna. Mieszkanie było kawalerką o dużym metrażu z dużą kanapą...";
$wynik = preg_match_all($wzor_regexp, $zdanie , $array);
echo "Znalezione dopasowania: " . $wynik;
?>
Wynik skryptu PHP:
Znalezione dopasowania: 3
- Funkcja preg_match_all() znalazła trzy dopasowania w wyrazach: kawa, kawalerka, kanapą.
Przykład 1.3
Przykład jak jest różnica pomiędzy funkcjami preg_match() oraz preg_match_all(), o czym wspomniałem wcześniej w najczęściej używanych funkcjach preg_ wbudowanych w PHP.
<?php
$wzor_regexp = "/ka[wn]a/";
$zdanie = "...na biurku ułóżono stos kartek, długopis, kalkulator oraz duży kubek kawy z napisem - kawa poranna. Mieszkanie było kawalerką o dużym metrażu z dużą kanapą...";
$wynik = preg_match($wzor_regexp, $zdanie , $array);
echo "Znalezione dopasowania: " . $wynik;
?>
Wynik skryptu PHP:
Znalezione dopasowania: 1
- * Funkcja PHP preg_match() przestaje wyszukiwać po znalezieniu pierwszego dopasowania, podczas gdy funkcja preg_match_all() kontynuuje wyszukiwanie do końca ciągu i znajduje wszystkie możliwe dopasowania, zamiast zatrzymywać się przy pierwszym dopasowaniu.
2.0 Predefiniowane klasy znaków
Niektóre znaki, takie jak cyfry, litery i białe spacje, są używane tak często, że istnieją dla nich skróty. Poniższa tabela zawiera listę predefiniowanych klas znaków.
Tabela znaków predefiniowanych
. - Pasuje do pojedynczego znaku z wyjątkiem znaku nowej linii \n.
\d - pasuje do dowolnej cyfry.
\D - Pasuje do dowolnego znaku innego, niż cyfra.
\s - Pasuje do dowolnego znaku odstępu ( spacja, tabulacja, znak nowej linii lub znaku końca linii ). Taki sam jak [\t\n\r]
\S - Pasuje do dowolnego znaku innego, niż odstęp. Taki sam jak [^ \t\n\r]
\w - Pasuje do dowolnego znaku wyrazu ( definiowany jako od a do z, od A do Z, od 0 do 9 i podkreślnik ). Taki sam jak[a-zA-Z_0-9]
\W - Pasuje do dowolnego znaku innego, niż znak wyrazu. Taki sam jak [^a-zA-Z_0-9]
Przykład 2.1
Poniższy przykład pokazuje, jak znaleźć i zastąpić spację, znakiem myślnika w ciągu znaków, używając wyrażenia regularnego preg_replace() oraz funkcji str_replace() w PHP.
<?php
$wzor_regexp = "/\s/";
$zmien = "-";
$tekst = "Myślenie kreatywne to myślenie prowadzące do uzyskania\noryginalnych i stosownych rozwiązań.\n";
// Opcja 1 - Zmień spacje, tabulacje, znak nowej linii lub znak nowej linii na znak ( - )
echo preg_replace($wzor_regexp, $zmien, $tekst);
echo "
";
// Opcja 2 - Zmień tylko spacje na znak myślnika ( - )
echo str_replace(" ", "-", $tekst);
?>
Wynik skryptu PHP:
Myślenie-kreatywne-to-myślenie-prowadzące-do-uzyskania-oryginalnych-i-stosownych-rozwiązań.- Myślenie-kreatywne-to-myślenie-prowadzące-do-uzyskania oryginalnych-i-stosownych-rozwiązań.
- Opcja 1 usunęła wszystkie znaki spacji, łącznie z znakami nowej lini \n i zamieniła na znak myślnika ( - ).
- Opcja 2 zamieniła wszystkie spacje na znak myślnika, pomijając wszystkie inne znaki w zmiennej $tekst.
3.0 Liczniki powtórzeń
W poprzedniej sekcji dowiedzieliśmy się, jak dopasować pojedynczy znak w różnych sytuacjach. Ale co jeśli chcesz dopasować więcej niż jeden znak w wyrażeniu regexp ?
Na przykład, powiedzmy, że chcesz znaleźć słowa zawierające jedno lub więcej wystąpień litery p lub słów zawierających co najmniej dwa p, itp. Tu zaczynają działać kwantyfikatory za pomocą, których możesz określić, ile razy znak w wyrażeniu regularnym powinien pasować.
Poniższa tabela zawiera listę różnych sposobów kwantyfikacji określonego wzorca regexp dla litery p ( mała litera ).
p+ - Pasuje do jednego lub więcej wystąpień litery p.
p* - Pasuje do zero lub więcej wystąpień litery p.
p? - Pasuje do zero lub jednego wystąpienia litery p.
p{2} - Dopasowuje dokładnie dwa wystąpienia litery p.
p{2,3} - Dopasowuje co najmniej dwa wystąpienia litery p, ale nie więcej niż trzy wystąpienia litery p.
p{2,} - Pasuje do dwóch lub więcej wystąpień litery p.
p{,3} - Pasuje do co najwyżej trzech wystąpień litery p.
Przykład 3.1
Wyrażenie regularne w poniższym przykładzie podzieli ciąg znaków ( $tekst ) na tablicę za pomocą funkcji preg_split() w PHP. Uwzględniona została kwantyfikacja wzoru regexp dla predefiniowanej klasy \s, czyli - pasuje do dowolnego znaku odstępu ( spacja, tabulacja, znak nowej linii lub znaku końca linii ) 2.0 Predefiniowane klasy znaków.
Wyrażenie regularne: /[\s,]+/
Kwantyfikatory:
Przecinek odpowiada za każdy znak z zakresu klasy \s, występujący wiele razy po sobie.
Plus odpowiada za wielokrotne wystąpienie pełnych słów w wyniku.
<?php
$wzor_regexp = "/[\s,]+/";
$tekst = "Mój ulubiony kolor to niebieski, zielony, beżowy lub żółty";
$wykonaj = preg_split($wzor_regexp, $tekst);
// Wyświetl tablicę
print_r ($wykonaj);
?>
Wynik skryptu PHP z wyrażeniem regularnym /[\s,]+/
Array ( [0] => Mój [1] => ulubiony [2] => kolor [3] => to [4] => niebieski [5] => zielony [6] => beżowy [7] => lub [8] => żółty )
- Funkcja zamieniła wszystkie słowa zdania na odrębne części w tablicę $wykonaj. Dzięki wyrażeniu /[\s,]+/ usunięto wszytskie znaki przyporządkowane do znaku predefiniowanego \s tzn. spacja, tabulacja, znak nowej linii lub znak końca linii
Przykład 3.2
Wynik skryptu PHP z przykładu 3.1 z wyrażeniem regularnym /[\s,]/ - brak znaku plus.
Ciąg znaków - "Mój ulubiony kolor to niebieski, zielony, beżowy lub żółty"
Array ( [0] => Mój [1] => ulubiony [2] => kolor [3] => to [4] => niebieski [5] => [6] => zielony [7] => [8] => beżowy [9] => lub [10] => żółty )
Przykład 3.3
Wynik skryptu PHP z przykładu 3.1 z wyrażeniem regularnym /[\s]+/ - brak znaku przecinek.
Ciąg znaków - "Mój ulubiony kolor to niebieski, zielony, beżowy lub żółty"
Array ( [0] => Mój [1] => ulubiony [2] => kolor [3] => to [4] => niebieski, [5] => zielony, [6] => beżowy [7] => lub [8] => żółty )
4.0 Kotwice.
Istnieją sytuację, gdy chcemy dopasować tylko pierwsze elementy w wierszu ( linii ) za pomocą regexp. Dotyczy to np. dokumentów, baz danych. W tym celu używamy kotwic.
Istnieją dwa znaki określające początek ciągu znaków, daszek ( ^ ) oraz koniec ciągu znaków tzn. znak dolara ( $ ).
^p - Pasuje do litery p na początku wiersza.
p$ - Pasuje do litery p na końcu wiersza.
Przykład 4.1
Wyrażenie regularne w poniższym przykładzie wyświetli tylko te nazwy z tablicy, które zaczynają się od wielkiej litery "S" przy użyciu funkcji preg_grep() w PHP.
<?php
$wzor_regexp = "/^S/";
$postacie = array("IronMan", "Hulk", "Thanos", "Strange", "Venom", "", "Vision", "Daredevil", "Thor", "Groot", "Star-Lord", "Gamora", "Mystique", "Drax", "BatMan", "Electro", "Volverine", "Wasp", "Nightcrawler", "Blob", "Heimdall", "SpiderMan", "Ultron", "Scorpion");
$wynik = preg_grep($wzor_regexp, $postacie);
// Wyświetl tablicę z wynikiem
print_r ($wynik);
?>
Wynik skryptu PHP:
Array ( [3] => Strange [10] => Star-Lord [21] => SpiderMan [23] => Scorpion )
- Funkcja utworzyła tablicę z elementami rozpoczynającymi się od wielkiej litery "S", przyporządkowując indeksom tablicy identyfikator wystąpienia w kolejności rosnącej, poczynając od zera.
5.0 Modyfikatory wzorów.
Modyfikator wzoru pozwala kontrolować sposób obsługi dopasowania wzorca. Modyfikatory wzoru są umieszczone bezpośrednio po wyrażeniu regularnym, na przykład, jeśli chcesz, aby znaleźć wzór w sposób bez uwzględniania wielkości liter, można użyć modyfikatorów, jak ten: /wzor_regexp/i.
W poniższej tabeli wymieniono niektóre z najczęściej używanych modyfikatorów wzorca.
i - Sprawia, że nie jest zależny od wielkości liter.
m - Zmienia zachowanie znaku ^ i znaku $ dopasowania względem granicy nowej linii ( tj. Początek lub koniec każdej linii w ciągu wieloliniowym ), zamiast granicy ciągu.
g - Wykonaj dopasowanie globalne, tzn. Znajdzie wszystkie wystąpienia.
o - Dopasuje wyrażenie tylko raz.
s - Zmienia zachowanie znaku . ( kropka ), aby pasowało do wszystkich znaków, w tym znaków nowej linii.
x - Pozwala na dopasowanie spacji i komentarzy w wyrażeniu regularnym dla przejrzystości.
Przykład 5.1
Poniższy przykład pokazuje, jak wykonać globalne wyszukiwanie bez rozróżniania wielkości liter przy użyciu modyfikatora ( i ) oraz funkcji preg_match_all() w PHP.
<?php
$wzor_regexp = "/eur/i";
$tekst = "Tegoroczne wakacje miałam spędzić podróżując po Europie. Już dawno rodzice wykupili wycieczkę wiodącą przez wspaniałe europejskie kraje. EUROPA jest Wspaniała!";
$wynik = preg_match_all($wzor_regexp, $tekst, $array);
echo $wynik . " - znalezione dopasowania.";
?>
Wynik skryptu PHP:
3 - znalezione dopasowania.
- Funkcja dopasowała wszystkie elementy, które zawierały zwrot "eur", bez uwzględniania wielkości liter.
Przykład 5.2
Podobnie poniższy przykład pokazuje, jak wykonać globalne wyszukiwanie bez rozróżniania wielkości liter przy użyciu modyfikatora ( i ) oraz ( m ) w funkcji preg_match_all() w PHP. Uwzględniono również kotwicę ( ^ ).
<?php
$wzor_regexp = "/^eur/im";
$tekst = "Tegoroczne wakacje miałam spędzić podróżując po Europie.\nJuż dawno rodzice wykupili wycieczkę wiodącą przez wspaniałe europejskie kraje.\nEUROPA jest Wspaniała!";
$wynik = preg_match_all($wzor_regexp, $tekst, $array);
echo $wynik . " - znalezione dopasowania.";
?>
Wynik skryptu PHP:
1 - znalezione dopasowania.
- Funkcja dopasowała wszystkie elementy, które zawierały zwrot "eur", brak uwzględniania wielkości liter ( i ), wzorzec musi być na początku wiersza ( ^ ) oraz dopasowuje względem granicy nowej linii ( m ).
6.0 Granice słów.
Znak granicy słowa ( \b ) pomaga w wyszukiwaniu słów, które zaczynają się i / lub kończą wzorem. Na przykład wyrażenie regularne /\bana/ pasuje do słów zaczynających się od wzoru np. analiza, ananas itp. Nie pasuje do innych słów zawierających frazę ana na początku np. lubiana, skazana lub zawierjących wzór wewnątrz słowa np. banan kilkanaście.
Przykład 6.1
Poniższy przykład podkreśli słowa zaczynające się od zwrotu ana.
<?php
$wzor_regexp = '/\bana\w*/';
$zmien = "<u>$0</u>";
$tekst = "Słowa zaczynające się od ana: analiza, ananas, anatomia, anarchia. Słowa kończące się zwrotem ana: skazana, lubiana, fatamorgana, pana. Słowa zawierającę wewnętrz zwrot ana: kilkanaście, banan, banał.";
echo preg_replace($wzor_regexp, $zmien, $tekst);
?>
Wynik skryptu PHP:
Słowa zaczynające się od ana: analiza, ananas, anatomia, anarchia. Słowa kończące się zwrotem ana: skazana, lubiana, fatamorgana, pana. Słowa zawierającę wewnętrz zwrot ana: kilkanaście, banan, banał.
- Wskazówka: Powyższy przykład służy do tworzenia zaawansowanych wyszukiwarek ! Google korzysta z podobnych algorytmów.
Przykład 7.1
Przykład prostego wzorca sprawdzającego poprawność wpisanego w formularz adresu e-mail.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}
- Jest to najprostsza wersja walidacji adresów email.
- Szczegółowa specyfikacja, dotyczącą wysyłania wiadomości regulowana jest przez RFC 822.
- Pełne wyrażenie do walidacji adresu email przez wzorzec regexp znajduje się - Mail::RFC822::Address: regexp-based address validation.
- Do sprawdzania poprawności forularza przydaje się również funkcja PHP, jaką jest filter_var() - więcej informacji.
8.0 Podsumowanie - wszystkie klasy.
Poniżej znajdą Państwo wszystkie tablice z elementami dotyczącymi wyrażeń regularnych w PHP.
8.1 Klasy znaków.
[abc] - Pasuje do którejkolwiek z liter a, b lub c.
[^abc] - Pasuje do dowolnego znaku innego niż a, b lub c.
[a-z] - Pasuje do dowolnego znaku od małej litery a do małej litery z.
[A-Z] - Pasuje do dowolnego znaku od wielkiej litery A do wielkiej litery Z.
[a-Z] - Pasuje do dowolnego znaku od małej litery ado dużej litery Z.
[0-9] - Pasuje do pojedynczej cyfry od 0 do 9.
[a-z0-9] - Pasuje do pojedynczego znaku od małej litery a do dużej litery z lub od cyfry 0 do 9.
8.2 Predefiniowane klasy znaków.
. - Pasuje do pojedynczego znaku z wyjątkiem znaku nowej linii \n.
\d - pasuje do dowolnej cyfry.
\D - Pasuje do dowolnego znaku innego, niż cyfra.
\s - Pasuje do dowolnego znaku odstępu ( spacja, tabulacja, znak nowej linii lub znaku końca linii ). Taki sam jak [\t\n\r]
\S - Pasuje do dowolnego znaku innego, niż odstęp. Taki sam jak [^ \t\n\r]
\w - Pasuje do dowolnego znaku wyrazu ( definiowany jako od a do z, od A do Z, od 0 do 9 i podkreślnik ). Taki sam jak[a-zA-Z_0-9]
\W - Pasuje do dowolnego znaku innego, niż znak wyrazu. Taki sam jak [^a-zA-Z_0-9]
8.3 Liczniki powtórzeń.
p+ - Pasuje do jednego lub więcej wystąpień litery p.
p* - Pasuje do zero lub więcej wystąpień litery p.
p? - Pasuje do zero lub jednego wystąpienia litery p.
p{2} - Dopasowuje dokładnie dwa wystąpienia litery p.
p{2,3} - Dopasowuje co najmniej dwa wystąpienia litery p, ale nie więcej niż trzy wystąpienia litery p.
p{2,} - Pasuje do dwóch lub więcej wystąpień litery p.
p{,3} - Pasuje do co najwyżej trzech wystąpień litery p.
8.4 Kotwice.
^p - Pasuje do litery p na początku wiersza.
p$ - Pasuje do litery p na końcu wiersza.
8.5 Modyfikatory wzorów.
i - Sprawia, że nie jest zależny od wielkości liter.
m - Zmienia zachowanie znaku ^ i znaku $ dopasowania względem granicy nowej linii ( tj. Początek lub koniec każdej linii w ciągu wieloliniowym ), zamiast granicy ciągu.
g - Wykonaj dopasowanie globalne, tzn. Znajdzie wszystkie wystąpienia.
o - Dopasuje wyrażenie tylko raz.
s - Zmienia zachowanie znaku . ( kropka ), aby pasowało do wszystkich znaków, w tym znaków nowej linii.
x - Pozwala na dopasowanie spacji i komentarzy w wyrażeniu regularnym dla przejrzystości.
-
Portfolio grafika - Piotr Chuptyś
Zobacz portfolio, więcej o grafice.
-
Portfolio animacje - Piotr Chuptyś
Zobacz portfolio, więcej o animacjach.
-
Portfolio WordPress - Piotr Chuptyś
Zobacz portfolio, więcej o WordPress.