PHP działa z wyrażeniami regularnymi

Co to są wyrażenia regularne

Zasadniczo sposób działania wyrażeń regularnych można opisać w następujący sposób:, Wyrażenie regularne jest metodą dopasowywania do wzorca lub dopasowywania modeli w ciągu znaków. PHP najczęściej używa PCRE lub „Wyrażeń regularnych zgodnych z Perlem”. Dzisiaj porzucimy proste metody wyszukiwania ciągów i będziemy pracować z silniejszym narzędziem, którego wiele osób używa, ale nie wie, jak to działa. Tutaj spróbujemy rozszyfrować bezsensowne hieroglify, tak jak wszyscy myślą, i zrobimy to na przykładach. Największym błędem popełnianym przez ludzi podczas nauki wyrażeń regularnych jest próba zrozumienia wszystkiego za jednym razem..

Zacznijmy się uczyć

Utwórz plik index.php na swoim serwerze testowym i umieść w nim kod:

Zmodyfikujmy nieco kod i dodajmy funkcję preg_match().

Po uruchomieniu skryptu otrzymamy 1, co oznacza, że ​​część tekstu została znaleziona w łańcuchu $string (PHP 1 i PRAWDZIWE równe odpowiedzi).

Podaliśmy przykład, jak znaleźć ciąg znaków, ale istnieje sposób, aby zrobić to szybciej za pomocą standardowych funkcji php StrPoz () i strstr ().

Określanie początku ciągu znaków w wyrażeniu regularnym

Aby wskazać początek linii w wyrażeniu, dodaj znak ^, mówmy mniej i spróbujmy w praktyce zmienić nasz kod na następującą postać:

Po wykonaniu kodu zobaczysz napis „Ta linia zaczyna się od abc”, ponieważ nasz ciąg naprawdę zaczyna się od liter „abc”. Symbol (^) daje nam wyszukiwanie tylko na początku łańcucha, ale nie do końca. W tej konstrukcji jest domyślnie rozróżniana wielkość liter..

Wyszukaj podłańcuch na początku, bez uwzględniania wielkości liter

Wcześniej używaliśmy kombinacji if(preg_match(„/^ABC/”, $strunowy)), ale ta kombinacja dałaby błędny wynik, ponieważ rozróżniana jest wielkość liter. Weź pod uwagę kod PHP, w którym podczas wyszukiwania nie będzie rozróżniana wielkość liter..

Projekt tylko trochę się zmienił i dodano kolejny modyfikator ja preg_match(“/^ABC/ja“, $strunowy) – bez rozróżniania wielkości liter (bez rozróżniania wielkości liter). Po naszych poprawkach skrypt idealnie odnajdzie podłańcuch.

Jak znaleźć ciąg po jego zakończeniu

Pod wieloma względami wyszukiwanie ciągu według jego zakończenia jest podobne do poprzedniego przykładu.. Wystarczy dodać z na końcu wzorca wyszukiwania.

Ponieważ nasza linia kończy się na 89 a wzorzec wyszukiwania pasuje do końca łańcucha, wtedy wynikiem będzie „Koniec linii to 89”.

Symbol meta

Używaliśmy już znaków specjalnych, takich jak (^) i ($) te symbole, wraz z innymi nazywane są metaznakami. Oto lista metaznaki które są również używane w wyrażeniach regularnych:

. (Kropka)
^ (Karat) - początek ciągu
* (Asteriks) - oznacza dowolną liczbę znaków w łańcuchu, przed „gwiazdką”, w tym zero znaków.
+ (Plus) - wskazuje na to, że występuje poprzedni znak lub wyrażenie 1 lub więcej razy. odgrywa tę samą rolę, który jest symbolem gwiazdki (*), z wyjątkiem przypadków zerowych wystąpień.
? (Znak zapytania) - oznacza, że występuje poprzedni znak lub wyrażenie regularne 0 lub 1 pewnego razu. Używany głównie do wyszukiwania pojedynczych znaków.
{ (Otwierający nawias klamrowy)
} (Zamykający nawias klamrowy) – {a,b} to liczba wystąpień poprzedzającego znaku lub podwzorca z a do b. Jeśli nie określono, liczy się, że nie ma górnej granicy. Na przykład, * - to samo, Co {0,}. ? - także, Co {0,1}. {5,7}5,6 lub 7 powtórki.
[ (Klamra otwierająca)
] (Klamra zamykająca) – przeznaczony do określenia podzbioru znaków. Nawiasy kwadratowe, wewnątrz wyrażenia regularnego, liczyć jako jeden znak, który może przyjmować wartości, wymienione w tych nawiasach.
\ (Ukośnik wsteczny) - używane do ucieczki przed znakami specjalnymi, to znaczy, że znaki ucieczki należy interpretować dosłownie, tj. nie jako metaznaki, ale jako proste postacie.
| (Rura) – działa jako operator logiczny „LUB” w wyrażeniach regularnych i służy do określenia zestawu alternatyw 'odnośnie(a|mi)d'.
( (Pary otwierające)
) (Zamykanie nawiasów) – przeznaczony do wyróżniania grup wyrażeń regularnych. Są przydatne, gdy są używane z „|” i podczas wyodrębniania podciągu za pomocą polecenia wyr.

Podczas tego samouczka przyjrzymy się każdemu z meta znaków z przykładami., ale ważne, żebyś wiedział, czym oni są. Jeśli chcesz znaleźć ciąg zawierający jeden z tych znaków, Na przykład: “1 + 1“, wtedy potrzebujesz, aby program uznał je za zwykłe znaki, a nie cel z symbolami, Aby to zrobić, dodaj ukośnik odwrotny i wyjdź ze znaku:

w tym przykładzie \ uciekł przed plusem, a wyrażenie użyło go jako zwykłego znaku, w przeciwnym razie wyrażenie miałoby wartość false.

Zastanów się, co mogą zrobić inne postacie meta

Widzieliśmy już znak karetki ^ i dolara $? spójrzmy na innych, zaczynając od nawiasów kwadratowych []. Nawiasy kwadratowe przeznaczony do wyszukiwania znaków [Alfabet] lub zakres znaków [a-f]. Spójrzmy na przykład wyrażenia regularnego:

Wyrażenie zwróci wartość true, jeśli łańcuch zawiera słowa big, bagno, błąd, worek, ale nie błagać.

Możesz również użyć tej kombinacji [abcdef$], w tym przypadku znak $ będzie tylko dolarem, ale nie symbolem meta. Prawie wszystkie metaznaki są nieistotne, z wyjątkiem niektórych przypadków.

Wypróbujmy następujący skrypt:

Wyjście skryptu będzie 0 -> skrypt wyświetla znaki do znaku b.

Spróbujmy nieco zmodyfikować nasz skrypt i użyć funkcji preg_match_all().

Jak widać z danych wyjściowych powyższego skryptu, drukuje wszystkie znaki ciągu, które nie pasują do wzoru „B”
acefghijklmnopqrstuvwxyz0123456789.
Pójdźmy o krok dalej, aby odfiltrować wszystkie liczby z łańcucha.:

Ten skrypt zwraca ciąg znaków:
abcefghijklmnopqrstuvwxyz

Na podstawie powyższego kodu widzimy, że znak ^ w powyższych przykładach oznacza negację (Wszystkie oprócz wymienionych znaków).

Zostań z nami, jeszcze bardziej interesujące

Spróbujmy użyć ucieczki znaków meta, używać ich w wyszukiwaniu. Najłatwiej będzie to zrozumieć na podstawie wyniku, Na przykład:

Wynik skryptu będzie:

[]

Dzieje się tak, ponieważ wskazaliśmy, że chcemy wziąć wszystkie pasujące postacie []. Aby wyrażenie działało poprawnie, użyliśmy ukośników, jeśli chcesz, aby ukośnik był traktowany jako zwykły znak, będziesz musiał dołączyć dwa ukośniki \\, na przykład dla takiego wyrażenia c:\katalogplik.php.

Rozważ pracę z operatorem kropki ( . ) z prostym przykładem:

W rezultacie otrzymamy 1, ponieważ nasz ciąg zawiera słowo seks, to wyrażenie będzie również pasować do słów SOX, SUX i SX, ale nie znajdzie Stixa.

Spróbujmy policzyć liczbę słów w łańcuchu za pomocą wyrażenia regularnego z kropką.

Powyższy kod zwróci to:
seks
w
południe
podatki
4

Najpierw wyprowadzamy linię, a operator n odsłonił myślniki. Poniżej widzimy numer 4, to liczba słów znalezionych przez funkcję preg_match_all ().

Popracujmy teraz z symbolem meta. ( * ). Ten operator dopasuje dowolną liczbę dowolnych znaków, co może zależeć od operatora, i może nie istnieć. Spójrzmy na poniższy przykład:

W rezultacie otrzymamy 1 odkąd znaleźliśmy 1 wyrażenie pasujące do wyrażenia. Prawdziwy jest również pp (żadnych symboli) i phhhhp (z wieloma postaciami).

Jeśli musimy wykluczyć pusty wynik, taki jak pp, wtedy możesz użyć symbolu meta ( + ). Spójrzmy na przykład:

Użycie symboli ( + ) działa jak ( * ), ale plus nie uwzględnia pustej wartości.

Nasz następny znak meta to znak zapytania. ( ? ), oznacza to, że poprzedni znak może być, może nie być. Przykładem może być napisanie numeru telefonu, oba wyrażenia będą prawdziwe (1234-5678) i (12345678).

Ten sam wynik będzie przy użyciu następującego kodu:

Dalej mamy aparat ortodontyczny lub {} metaznak. Określa liczbę wystąpień poprzedniego wyrażenia lub zakresu. Nawiasy klamrowe muszą być poprzedzone ukośnikiem "[0-9]\{5\}”.
Wyrażenie "[0-9]\{5\}” – dopasowuje podłańcuch złożony z pięciu cyfr dziesiętnych (znaki z zakresu od 0 do 9, włącznie).

Następnie użyjemy wyrażenia, w którym po tekście „PHP” należy dokładnie uzupełnić 3 liczby.

Wynik wyrażenia regularnego będzie prawdziwy (1). Z wyrażenia regularnego widać, że musi zaczynać się od tekstu PHP i kończyć się trzema cyframi z 0 do 9.

Sekwencje specjalne

Ukośnik odwrotny jest również używany do specjalnych sekwencji. Zobaczmy, jakie są sekwencje?

  • \d - wyraża dowolne znaki numeryczne jak wyrażenie [0-9]
  • \D - dopasowuje dowolne znaki numeryczne, takie jak [^ 0-9]
  • \s - dopasowuje dowolny znak formularza [ \tnrfv]
  • \S - dopasowuje dowolny znak formularza [^ tnrfv]
  • \w - dopasowuje dowolne znaki alfanumeryczne i podkreślenia podobne [a-zA-Z0-9_]
  • \W - dopasowuje dowolne znaki alfanumeryczne i podkreślenia podobne [^a-zA-Z0-9_]

Te sekwencje mogą być używane do skracania wyrażeń regularnych. Poniższy przykład pokazuje, jak usunąć ciąg dodatkowych znaków..

Takie wyrażenie przyda się w przypadku konieczności wyczyszczenia loginu użytkownika, z dodatkowych i nieprawidłowych znaków.

Ponadto podczas czyszczenia sznurka często trzeba się upewnić, że łańcuch nie zaczyna się od cyfr, można to zrobić za pomocą następującego przykładu:

Ten przykład pokazuje, że cyfra jest budowana jako pierwsza w łańcuchu 2.

Użyjmy kropki, aby określić, czy łańcuch zawiera co najmniej jeden znak..

Punkt ( . ) oznacza dowolny znak, przynajmniej jeden, z wyjątkiem znaku nowej linii (\n).

Spróbujmy użyć sekwencji s, aby uzyskać liczbę słów w łańcuchu oddzielonych n.

Wynik wyrażenia:

seks
w
południe
podatki
4

Podsumujmy naszą wiedzę

Zacznijmy łączyć nasze wyrażenia w bardziej złożoną formę. Poniższe wyrażenie wskazuje, że ciąg znaków musi zawierać jedno ze słów This lub That lub There.

Kolejny ciekawy przykład skryptu do określania początku słowa.

Rozwińmy powyższy kod., abyśmy mogli zobaczyć, od jakich znaków zaczyna się słowo, i wyświetlić te znaki oraz samo słowo na ekranie:

Jeśli zrobiłeś wszystko dobrze, wtedy wynikiem wyrażenia będzie:

0->Witam
1->On

$mecze[0] zawiera pełny tekst szablonu wyrażenia - Witaj.
$mecze[1] zawiera pierwszą część szablonu wyrażenia.

Modyfikatory i twierdzenia

Jak widzieliśmy wcześniej w tym samouczku, udało nam się utworzyć wyrażenie regularne, który uwzględniał wielkość liter przy użyciu /i . To jest modyfikator i jest jednym z wielu używanych w wyrażeniach regularnych do wprowadzania zmian w zachowaniu dopasowywania wzorców.. Oto lista modyfikatorów i asercji wyrażeń regularnych, używany w PHP.

Modyfikatory

i — bez rozróżniania wielkości liter.
U - odwraca chciwość. to znaczy, aby wzór pasował do jak największej liczby znaków, objęte tym szablonem.
s - jeśli jest używany, potem symbol . pasuje również do nowej linii n. Inaczej nie pasuje..
m - wieloliniowy (Wiele linii)
x — powoduje, że wszystkie znaki spacji bez zmiany znaczenia są ignorowane, jeśli nie są wymienione w klasie postaci. Wygodny, gdy chcesz użyć enterów i spacji, aby ułatwić czytanie w wyrażeniu regularnym.
e - Jeśli ten modyfikator jest używany, preg_replace() po wykonaniu standardowych podstawień w zastępowanym ciągu interpretuje go jako kod PHP i wykorzystuje wynik do zastąpienia szukanego ciągu. Pojedyncze i podwójne cudzysłowy, ukośniki odwrotne (\) Znaki NULL zostaną poprzedzone ukośnikami odwrotnymi w zastąpionych odwołaniach wstecznych. (Działa tylko z preg_replace).
S - na wszelki wypadek, jeśli planujesz ponownie użyć szablonu, warto poświęcić trochę więcej czasu na jego analizę, aby skrócić czas realizacji. Kiedy, jeśli ten modyfikator jest używany, przeprowadzana jest dodatkowa analiza szablonu. Obecnie ma to sens tylko w przypadku „niezakotwiczonych” szablonów., nie zaczynający się od żadnego konkretnego znaku. Więcej na ten temat później.

Sprawozdania

b – Granica słowa (granica słowa)
Granica słowa jest tworzona między dwoma modyfikatorami „b”..
Jest to specjalny „wspierający typ modyfikatorów”., które umożliwiają określenie DOKŁADNEGO dopasowania.
Tekst musi pasować tylko do dokładnego wzorca zawartego w „b”
Na przykład, wzorzec „kot” nie pasuje do „katalogu”.
B – Brak granicy słowa (nie jest granicą słowa)
Ten modyfikator jest powiązany z poprzednim., ale B nie warunkuje granicy słowa, wręcz przeciwnie, zaprzecza granicy słowa. Ten modyfikator jest przydatny, gdy musisz znaleźć coś w tekście, który jest wewnątrz słowa, ale nie na samym początku ani na końcu frazy.
A – PCRE_ANCHORED
Jeśli ten modyfikator jest używany, dopasowanie wzorca zostanie osiągnięte tylko wtedy, gdy, jeśli jest „zakotwiczony”, tj. pasuje do początku łańcucha, w którym odbywa się wyszukiwanie. Ten sam efekt można osiągnąć za pomocą odpowiedniej zagnieżdżonej konstrukcji szablonu, co jest jedynym sposobem na zaimplementowanie tego zachowania w Perlu.
Z - oznaczający koniec linii.
koniec danych lub pozycja przed ostatnią nową linią (niezależnie od trybu wielowierszowego).
z - wskazujący koniec linii.
koniec danych (niezależnie od trybu wielowierszowego).
G to pierwsza pasująca pozycja w łańcuchu.

Popracujmy z modyfikatorami i twierdzeniami z przykładami

Jak widać z powyższej listy, jest wiele sposobów, zmienić zachowanie wyrażeń regularnych, spróbujmy pracować z modyfikatorami i asercjami jeden po drugim, używając prostych przykładów.

modyfikator (ja)

Jeśli przeczytałeś poprzednie części tego samouczka, nie będzie niespodzianki, co ta konstrukcja uważała za podobną do „ABC” iz abc, ponieważ użyliśmy modyfikatora bez rozróżniania wielkości liter (ja) .

modyfikator (s)

Kontynuujmy badanie i rozważmy modyfikator (s). Jeśli ten modyfikator jest używany, potem symbol ( . ) pasuje również do nowej linii n. Inaczej nie pasuje.. Najpierw wypróbujemy przykład bez modyfikatora (s).

Jak widać, ten przykład zwrócił odpowiedź ( 0 ), żeby wynik był pozytywny. ( 1 ), i symbol ( . ) n, należy dodać do wyrażenia modyfikator ( s )? odbudować nasz przykład.

Powyższy kod wyświetli numer 1, ponieważ znaleziono łańcuch pasujący do wzorca wyrażenia.

modyfikator (m)

Podczas dodawania modyfikatora do ciągu, wydarzy się ciekawa magia. Wyrażenie regularne będzie traktować jeden wiersz jako wielokrotność, jeśli zawiera myślnik n. Aby łatwiej zrozumieć działanie modyfikatora, spójrz na przykład.

W tym przykładzie używamy symbolu meta ( ^ ) szukanie słowa „południe” na początku wiersza. Nasza linia zaczyna się od słowa seks, co oznacza, że ​​w zwykłym przypadku nie znaleźlibyśmy poszukiwanego słowa. Ponieważ w naszym przykładzie wszystkie słowa są oddzielone n i to kosztuje modyfikator ( m ), wówczas każde słowo będzie traktowane jako początek linii. Aby wyszukiwanie nie uwzględniało wielkości liter, dodaliśmy również modyfikator ( ja ). Jeśli przyjrzysz się uważnie powyższemu przykładowi, zobaczysz, że w pobliżu możesz użyć kilku modyfikatorów.

modyfikator ( x ) sprawia, że ​​nasze wyrażenie jest dłuższe, ale pozwala nam podzielić wyrażenie regularne na wiele wierszy i daje nam możliwość komentowania każdej akcji w wyrażeniu, komentarze w wyrażeniach regularnych czynią je bardziej zrozumiałymi. Nie ma sensu dalej opisywać., po prostu zobacz, jak zadziała to wyrażenie regularne, działa jak poprzedni, ale ma komentarze i modyfikatory ( imx ).

Nasz następny modyfikator jest ( S ), dzięki niemu możesz przeanalizować ciąg przed dopasowaniem do szablonu. Wyrażenie może ułatwić wykonanie wzorca w przypadku wielu wystąpień.

Rozważ przykład wielokrotnego wystąpienia (zbiegi okoliczności):

modyfikator ( S ) rzadko używane, ale nagle go spotkasz, będziesz wiedział, po co jest, lub dowiedz się, gdzie możesz przeczytać o tym modyfikatorze.

Następnie będziemy pracować z granicami słów b, ten modyfikator pozwala nam jasno określić, gdzie słowo się zaczyna, a gdzie kończy. Częstym błędem programistów polegającym na używaniu tego modyfikatora do wyszukiwania wystąpienia. Znalezienie wystąpienia za pomocą b zwróci fałsz. Spójrzmy na przykład:

Wyszukiwane słowo lab nie zostało znalezione w słowie available ze względu na użycie b we wzorcu. Dla modyfikatora b w wyszukiwaniu, słowa kot i katalog będą różnymi słowami.

Rozważ inny przykład znajdowania wyrażenia:

Wyszukiwanie powiodło się!

Modyfikator B

Ten modyfikator (\B) neguje granicę słowa. Modyfikator przyda się w przypadkach, gdy trzeba coś znaleźć w tekście, według wzoru, który jest w słowie, ale nie na samym początku ani na końcu frazy.

Przykład ze słowem, które zaczyna się od danego wystąpienia

Na przykład powinieneś zrozumieć, dlaczego nie znaleziono słowa „the”., wszystko dlatego, że za pomocą wyrażenia regularnego „/Btheb/” wskazaliśmy, że „the” to koniec wyrazu, ale nie całe słowo.

Modyfikator U używany do odwracania chciwości.

Ten modyfikator odwraca zachłanność kwantyfikatorów, dlatego domyślnie nie są chciwi. Ale bądź chciwy, jeśli następuje po nich znak ?. Można go również zainstalować za pomocą (?u) ustawienie modyfikatora w szablonie lub dodanie znaku zapytania po kwantyfikatorze (Na przykład, .*?).

Przykład użycia chciwych i leniwych wyrażeń z wikipedii

Wyrażenie (<.*>) pasuje do ciągu, zawierające wiele znaczników HTML, całkowicie.
<p><b>wp-admin.com.ua</b> — lekcje tworzenia stron internetowych i <ja>cms wordpress</ja> </p>
Aby wyróżnić poszczególne tagi, możesz zastosować leniwą wersję tego wyrażenia: (<.*?>) Nie pasuje do całej linii pokazanej powyżej, i indywidualne znaczniki (wyróżnione kolorem):
<p><b>wp-admin.com.ua</b> — lekcje tworzenia stron internetowych i <ja>cms wordpress</ja></p>

Używając preg_replace

Myślę, że łatwiej będzie Ci spróbować wpisać przedstawiony kod i spojrzeć na wynik działania funkcji.

Wielu programistów może zarzucić, że pracuje z funkcją str_replace() idzie znacznie szybciej, ale właśnie podaliśmy prosty przykład, będzie ciekawiej.

Rozważmy bardziej złożony przykład zamiany przy użyciu funkcji preg_replace().

Поработав с таким простым кодом мы можем видеть насколько раздутые шаблонизаторы и системы управления, а ведь все так просто.

Protokół https://www.php.su/lessons/?lesson_17

Protokół https://www.skillz.ru/dev/php/article-Regulyarnye_vyrazheniya_dlya_chaynikov.html

Protokół https://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html

Protokół https://www.compileonline.com/execute_php_online.php

Nikołajenko Maksym

Dyrektor studiów internetowych ProGrafika. rozwijam się, projektowanie i promocja stron internetowych. Zawsze cieszę się z nowych czytelników bloga i dobrych klientów.


Zostaw odpowiedź

Twoj adres e-mail nie bedzie opublikowany. wymagane pola są zaznaczone *

Ta strona używa Akismet do redukcji spamu. Dowiedz się, jak przetwarzane są dane dotyczące Twoich komentarzy.

Szablony WordPressa
Najlepszy hosting na Ukrainie
Stabilny hosting dla Drupala