Podczas pracy z tekstami w dowolnym współczesnym językuprogramiści nieustannie stają przed zadaniami sprawdzania wprowadzonych danych pod kątem zgodności z pożądanym wzorcem, znajdowania i zastępowania fragmentów testowych oraz innych typowych operacji przetwarzania informacji symbolicznych. Tworzenie własnych algorytmów weryfikacyjnych prowadzi do straty czasu, niekompatybilności kodu programu oraz złożoności w jego rozwoju i modernizacji.
Szybki rozwój Internetu i języków programowania WEBwymagało stworzenia uniwersalnych i kompaktowych sposobów przetwarzania informacji tekstowych z minimalną ilością wymaganego do tego kodu. Język PHP, który jest popularny wśród początkujących i profesjonalnych programistów, nie jest wyjątkiem. Wyrażenia regularne jako język szablonów tekstowych umożliwiają uproszczenie zadań przetwarzania tekstu i zredukowanie kodu programu o dziesiątki lub setki wierszy. Bez niego wielu zadań nie da się w ogóle rozwiązać.
Język PHP zawiera trzy mechanizmy do pracy zwyrażenia regularne to "ereg", "mb_ereg" i "preg". Najpopularniejszym jest interfejs „preg”, którego funkcje zapewniają dostęp do biblioteki regex PCRE, pierwotnie opracowanej dla języka Perl, która jest dołączona do PHP. Funkcje Preg szukają dopasowań w danym ciągu tekstowym zgodnie z pewnym wzorcem w języku wyrażeń regularnych.
W ramach krótkiego artykułu nie da się szczegółowo opisaćopisz całą składnię wyrażeń regularnych, istnieje na to specjalna literatura. Podamy tylko podstawowe elementy, aby pokazać szerokie możliwości programisty i zrozumieć przykłady kodu.
W PHP wyrażenie regularne jest formalnie zdefiniowanebardzo trudne, dlatego uprościmy opis. Wyrażenie regularne to ciąg tekstowy. Składa się z rozgraniczonego szablonu i modyfikatora, który określa, jak go obsłużyć. W szablonach można umieszczać różne alternatywy i powtórzenia.
Na przykład w wyrażeniu / d {3} -d {2} -d {2} / m separator będzie „/”, po którym następuje wzór i symbol "M" będzie modyfikatorem.
Cała moc wyrażeń regularnych jest zakodowana za pomocąza pomocą metaznaków. Głównym metaznakiem języka jest ukośnik odwrotny – „”. Zmienia typ następnego znaku na przeciwny (czyli zwykły znak staje się metaznakiem i odwrotnie). Innym ważnym metaznakiem jest ukośnik „|”, który określa alternatywy dla wzorca. Więcej przykładów metaznaków:
^ | Początek obiektu lub linii |
( | Początek podwzorca |
) | Zakończ wzór podrzędny |
{ | Początek kwantyfikatora |
} | Koniec kwantyfikatora |
d | cyfra dziesiętna od 0 do 9 |
D. | dowolny znak niecyfrowy |
z | puste, spacja, tabulator |
w | symbol słownictwa |
PHP traktuje spację jako oddzielny znak znaczący podczas przetwarzania wyrażeń regularnych, więc wyrażenia ABCGDE i ABC WHERE są różne.
W PHP regularne podwzorce są ujęte w nawiasy i czasami nazywane są „podwyrażeniami”. Pełnią następujące funkcje:
Podświetlanie alternatyw... Na przykład szablon ciepło (niektóre | ptak |) pasuje do słów „Ciepło”, „ognisty ptak” i "piec"... A bez nawiasów będzie to tylko pusty ciąg „ptak” i „pieczeń”.
„Ekscytujący” wzór podrzędny. Oznacza to, że jeśli podciąg pasuje do wzorca, jako wynik zwracane są wszystkie dopasowania. Dla jasności podamy przykład. Biorąc pod uwagę następujące wyrażenie regularne: zwycięzca otrzymuje ((złoto | pozłacane) (medal | puchar)) - oraz ciąg do wyszukiwania dopasowań: „Zwycięzca otrzymuje złoty medal”... Oprócz oryginalnej frazy wyszukiwanie zwróci: "Złoty medal", „Medal”, „złoto”.
Podczas pisania wyrażeń regularnych jest to bardzo powszechnekonieczne jest przeanalizowanie powtórzeń liczb i symboli. Nie stanowi to problemu, jeśli nie ma zbyt wielu powtórzeń. Ale co, jeśli nie znamy ich dokładnej liczby? W takim przypadku musisz użyć specjalnych metaznaków.
Do opisu powtórzeń stosuje się quadrifiers – metaznaki do określenia liczby. Quadrifiers są dwojakiego rodzaju:
Wspólny kwantyfikator dotyka minimum imaksymalna dozwolona liczba powtórzeń elementu w postaci dwóch liczb w nawiasach klamrowych, np. x {2,5}. Jeśli maksymalna liczba powtórzeń jest nieznana, pomijany jest drugi argument: x {2,}.
Skrócone kwantyfikatory to symbole najczęstszych powtórzeń, aby uniknąć niepotrzebnego przeciążenia składni. Powszechnie stosowane są trzy skróty:
1. * - zero lub więcej powtórzeń, co odpowiada {0,}.
2. + - jedno lub więcej powtórzeń, czyli {1,}.
3.? - zero lub tylko jedno powtórzenie - {0,1}.
Dla osób uczących się wyrażeń regularnych,przykłady są najlepszym samouczkiem. Przedstawimy kilka, które przy minimalnym wysiłku pokazują swoje szerokie możliwości. Wszystkie kody programu są w pełni kompatybilne z PHP 4.x i nowszymi wersjami. Dla pełnego zrozumienia składni i wykorzystania wszystkich funkcji języka polecamy książkę J. Friedla "Wyrażenia regularne", która w pełni analizuje składnię i podaje przykłady wyrażeń regularnych nie tylko w PHP, ale także dla języki Python, Perl, MySQL, Java, Ruby i C#.
Zadanie. Istnieje strona internetowa, na którejwymagany jest adres e-mail odwiedzającego. Wyrażenie regularne musi sprawdzić poprawność otrzymanego adresu przed wysłaniem wiadomości. Weryfikacja nie gwarantuje, że określona skrzynka pocztowa rzeczywiście istnieje i akceptuje listy. Ale może usunąć celowo niepoprawne adresy.
Rozwiązanie Jak w każdym języku programowania, w PHPReguły walidacji adresów e-mail można zaimplementować na wiele różnych sposobów, a przykłady w tym artykule nie są ostateczną i jedyną opcją. Dlatego w każdym przypadku podajemy listę wymagań, które należy wziąć pod uwagę podczas programowania, a konkretna implementacja zależy wyłącznie od dewelopera.
Tak więc wyrażenie walidacji wiadomości e-mail powinno sprawdzać następujące warunki:
Przykład uwzględniający wszystkie te warunki można zobaczyć na poniższym rysunku.
Zadanie. Sprawdź, czy podany ciąg tekstowy jest prawidłowym adresem URL. Zwróć uwagę, że wyrażenia regularne walidacji adresów URL można zaimplementować na wiele sposobów.
Rozwiązanie Nasza ostateczna wersja wygląda tak:
/^(https?://)?((da-z.->+).((az.††···················· * / ?
Teraz przeanalizujmy bardziej szczegółowo jego składniki, korzystając z obrazu.
przedmiot 1 | Przed adresem URL nie może być żadnych znaków |
pozycja 2 | Sprawdzanie obowiązkowego przedrostka „http” |
pozycja 3 | Nie powinno być żadnych symboli |
pozycja 4 | Jeśli występuje „s”, adres URL wskazuje bezpieczne połączenie „https” |
s. 5 | Wymagany fragment "//" |
pozycja 6 | Brak symboli |
s. 7-9 | Sprawdzanie poprawności domeny pierwszego poziomu i obecności kropki |
s.10-13 | Sprawdzanie pisowni domeny drugiego poziomu i kropki |
s. 14-17 | Struktura pliku adresu URL — zestaw cyfr, liter, podkreśleń, łączników, kropek i końcowego ukośnika |
Zadanie. Konieczne jest sprawdzenie poprawności wpisanego numeru karty plastikowej najpopularniejszych systemów płatności. Opcja jest rozważana tylko dla kart Visa i MasterCard.
Rozwiązanie Tworząc wyrażenie, musisz wziąć pod uwagęmożliwa obecność spacji we wpisanym numerze. Liczby na karcie są podzielone na grupy, co ułatwia czytanie i dyktowanie. Dlatego naturalne jest, że osoba próbuje wprowadzić liczbę w ten sposób (tzn. za pomocą spacji).
Napisz ogólne wyrażenie, które uwzględniamożliwe spacje i myślniki są trudniejsze niż po prostu usunięcie wszystkich znaków z wyjątkiem liczb. Dlatego zaleca się stosowanie w wyrażeniu metaznaku /D, który usuwa wszystkie znaki z wyjątkiem liczb.
Teraz możesz przejść bezpośrednio dosprawdzanie numeru. Wszystkie firmy obsługujące karty kredytowe używają unikalnego formatu numeru. Przykład korzysta z tego i klient nie musi wpisywać nazwy firmy - jest ona identyfikowana przez numer. Karty Visa zawsze zaczynają się od 4 i mają 13 lub 16 cyfr. MasterCard zaczyna się w zakresie 51-55 o długości liczby 16. W rezultacie otrzymujemy następujące wyrażenie:
Przed przetworzeniem zamówienia możesz dodatkowo sprawdzić ostatnią cyfrę liczby, która jest obliczana za pomocą algorytmu Luna.
Zadanie. Sprawdzenie poprawności wpisanego numeru telefonu.
Rozwiązanie Liczba cyfr w telefonach stacjonarnych i komórkowychNumery telefonów różnią się znacznie w zależności od kraju, dlatego niemożliwe jest uniwersalne sprawdzenie numeru telefonu za pomocą wyrażeń regularnych pod kątem poprawności. Ale numery międzynarodowe mają ścisły format i świetnie nadają się do sprawdzania wzorców. Co więcej, coraz więcej krajowych operatorów telefonicznych stara się przestrzegać jednego standardu. Struktura emisji jest następująca:
+ CCC.NNNNNNNNNNxEEEE, gdzie:
- C to 1-3-cyfrowy kod kraju.
- N - liczba do 14 cyfr.
- E to opcjonalne rozszerzenie.
Plus jest wymagany, a x występuje tylko wtedy, gdy wymagane jest rozszerzenie.
W rezultacie otrzymujemy następujące wyrażenie:
^ + [0-9] {1,3} [0-9] {4,14} (?: x. +)? $
Zadanie. Musisz upewnić się, że pasuje liczba całkowita z określonego zakresu. Dodatkowo wymagane jest, aby wyrażenia regularne znajdowały tylko liczby z zakresu wartości.
Rozwiązanie. Oto kilka wyrażeń dla kilku najczęstszych przypadków:
Określ godzinę od 1 do 24 | ^ (1 [0-2] | [1-9]) $ |
Dzień w miesiącu 1-31 | ^ (3 [01] | [12] [0-9] | [1-9]) $ |
Sekunda lub minuta 0-59 | ^ [1-5]? [0-9] $ |
Liczba od 1 do 100 | ^ (100 | [1-9]? [0-9]) $ |
Dzień roku 1 - 366 | ^ (36 [0-6] | 3 [0-5] [0-9] | [12] [0-9] {2} | [1-9] [0-9]?) $ |
Zadanie. Musisz określić, czy podany ciąg jest prawidłowym adresem IPv4 z zakresu 000.000.000.000-255.255.255.255.
Rozwiązanie Jak każde zadanie w PHP, wyrażenie regularne ma wiele odmian. Na przykład to:
Sprawdzanie poprawności wyrażeń regularnych dlaPoczątkujący programiści mogą stanowić wyzwanie ze względu na złożoność składni, która różni się od „normalnych” języków programowania. Aby rozwiązać ten problem, istnieje wiele testerów wyrażeń online, które pozwalają w łatwy sposób sprawdzić poprawność utworzonego szablonu na rzeczywistym tekście. Programista wprowadza wyrażenie i dane do weryfikacji i natychmiast widzi wynik przetwarzania. Zwykle istnieje również sekcja referencyjna, która szczegółowo opisuje wyrażenia regularne, przykłady i różnice w implementacji dla najpopularniejszych języków programowania.
Ale całkowicie zaufaj wynikom usług onlinenie zalecane dla wszystkich programistów PHP. Wyrażenie regularne, napisane i przetestowane osobiście, jest aktualne i gwarantuje brak błędów.