Menu

preg_match() w PHP: wyrażenia regularne z przykładami

preg_match($pattern, $subject, $matches) sprawdza string wyrażeniem regularnym i zwraca 1 przy dopasowaniu, a 0 przy jego braku. Poznaj grupy przechwytujące, grupy nazwane, preg_match_all, kotwice, wzorce do walidacji i modyfikator u dla UTF-8, polskich znaków i japońskiego.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

preg_match($pattern, $subject, $matches) sprawdza, czy string pasuje do wyrażenia regularnego. Zwraca 1 przy dopasowaniu, a w przeciwnym razie 0, i wypełnia $matches tym, co znalazło: preg_match('/\d+/', 'Order 4521 shipped', $m) zwraca 1 i ustawia $m[0] na "4521".

Wzorzec to string otoczony ogranicznikami, zwykle /.../, po których następują modyfikatory, takie jak i. Pisz wzorce w pojedynczych cudzysłowach: w podwójnych PHP najpierw rozwija $name i sekwencje ucieczki, takie jak \x41 czy \101, więc silnik wyrażeń regularnych może dostać inny wzorzec niż ten, który wpisałeś.

Grupy przechwytujące

Nawiasy we wzorcu przechwytują fragment stringa, do którego pasują. $m[0] to całe dopasowanie, $m[1] pierwsza grupa, $m[2] druga, licząc nawiasy otwierające od lewej.

Grupy nazwane

(?<name>...) nadaje grupie nazwę. Wartość jest zapisywana pod nazwą i pod numerem, więc kod czytający wynik nie psuje się, gdy ktoś doda grupę wcześniej we wzorcu.

Wszystkie dopasowania przez preg_match_all

preg_match_all() szuka dalej po pierwszym dopasowaniu i zwraca liczbę dopasowań. Domyślnie $m[0] zawiera wszystkie pełne dopasowania, a $m[1] wszystkie wartości pierwszej grupy. Z PREG_SET_ORDER dostajesz zamiast tego jedną tablicę na dopasowanie, po której łatwiej przejść pętlą.

Walidacja danych: kotwice, numery telefonów, kody pocztowe

Przy walidacji wzorzec musi pasować do całego stringa, więc zacznij go od ^ i zakończ $. Jedna pułapka: $ pasuje też przed końcowym znakiem nowej linii, więc '/^\d+$/' akceptuje "123\n". Dodaj modyfikator D albo użyj \z, które pasuje tylko na samym końcu.

W przypadku adresów e-mail wyrażenie regularne albo odrzuca poprawne adresy, albo akceptuje niepoprawne. Zamiast tego użyj filter_var($email, FILTER_VALIDATE_EMAIL) (zobacz filter_var()).

Modyfikator u dla UTF-8 i tekstu japońskiego

Bez modyfikatora u wzorzec działa na bajtach. Znak japoński zajmuje w UTF-8 trzy bajty, więc . pasuje do jednej trzeciej znaku, a długości wychodzą błędne (polskie litery zajmują dwa bajty i mają ten sam problem). Z u wzorzec działa na znakach i możesz używać klas właściwości Unicode.

u dodatkowo sprawdza poprawność stringa: jeśli nie jest to poprawny UTF-8, preg_match() zwraca false zamiast dopasowania.

Escapowanie danych od użytkownika przez preg_quote

Znaki takie jak ., +, ?, ( i / mają we wzorcu specjalne znaczenie. Jeśli część wzorca pochodzi ze zmiennej, na przykład z wyszukiwanej frazy, przepuść ją przez preg_quote() z ogranicznikiem jako drugim argumentem, inaczej 1+1 dopasuje 11, a nieescapowane / zepsuje wzorzec.

Niepoprawny wzorzec nie rzuca wyjątku. PHP wypisuje ostrzeżenie, a preg_match() zwraca false:

Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3

Dlatego sprawdzaj === false (albo preg_last_error_msg()), gdy wzorzec jest budowany w czasie działania. Do zwykłego sprawdzenia podciągu bez żadnego wzorca szybsza i czytelniejsza jest str_contains(). Aby zmienić dopasowany tekst, użyj preg_replace().

Najczęściej zadawane pytania

Co zwraca preg_match w PHP?

1, jeśli wzorzec pasuje, 0, jeśli nie, i false, jeśli sam wzorzec jest niepoprawny. Ponieważ 0 i false są traktowane jak fałsz, porównuj przez === 1, gdy musisz odróżnić błędny wzorzec od braku dopasowania.

Jak pobrać dopasowany tekst z preg_match?

Przekaż trzeci argument: preg_match('/(\d+)/', 'Order 4521', $m). Wtedy $m[0] to całe dopasowanie, a $m[1] pierwsza grupa przechwytująca, tutaj obie to "4521". Z grupą nazwaną (?<id>\d+) wartość jest też w $m['id'].

Czym różni się preg_match od preg_match_all?

preg_match() zatrzymuje się na pierwszym dopasowaniu. preg_match_all() znajduje wszystkie dopasowania, zwraca ich liczbę i wypełnia nimi $matches: preg_match_all('/\d+/', 'a1 b22 c333', $m) zwraca 3, a $m[0] to ["1", "22", "333"].

Jak używać preg_match z polskim, japońskim lub innym tekstem UTF-8?

Dodaj modyfikator u: preg_match('/^.{3}$/u', '日本語') zwraca 1. Bez u PHP traktuje string jako bajty, więc . pasuje do jednego bajtu znaku 3-bajtowego. Z u możesz też używać klas Unicode, takich jak \p{Han}, \p{Hiragana} i \p{Katakana}.

Jak sprawdzić, czy string zawiera tylko cyfry w PHP?

preg_match('/^\d+$/D', $s) albo, bez wyrażenia regularnego, ctype_digit($s). Modyfikator D (albo \z zamiast $) ma znaczenie: zwykłe $ akceptuje też końcowy znak nowej linii, więc "123\n" by przeszło.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ