chevron-left chevron-right

[PHP] Wyrażenia regularne – podstawy i przykłady

W dzisiejszym artykule poruszam temat wyrażeń regularnych, ponieważ ciągle stanowią one wciąż trudny orzech do zgryzienia dla wielu osób tworzących aplikacje webowe.

Wyrażenia regularne pozwalają na wykrywanie i identyfikację określonego ciągu znaków w tekście pisanym, który można następnie edytować, usuwać.

Przejdźmy więc do krótkiego przeglądu podstaw, a następnie pokażę kilka przykładów na wykorzystanie wyrażeń regularnych.

Wyrażenia regularne - podstawy

Wyrażenie regularne Do czego pasuje?
stron ciąg "stron"
^stron "stron" jak początek ciągu znaków
stron$ "stron" jako końcówka ciągu znaków
^stron$ "stron" jako kompletny ciąg znaków, nie występują dodatkowe znaki oprócz zdefiniowanych
[abc] a, b lub c
[a-z] jakakolwiek mała litera
[^A-Z] jakikolwiek znak niebędący dużą literą
(gif|jpg) porównuje czy gif czy jpg
[a-z]+ jedna lub więcej małych liter
^[a-zA-Z0-9_]{1,}$ jakiekolwiek słowo z przynajmniej jedną literą, cyfrą lub _
([wx])([yz]) wyszukuje wy, wz, xy lub xz
[^A-Za-z0-9] jakikolwiek symbol, a nie litera duża czy mała lub cyfra
([A-Z]{3}|[0-9]{4}) porównuje czy są 3 litery lub 4 cyfry

Funkcje PHP dotyczące wyrażeń regularnych

Funkcja Opis
preg_match() funkcja ta wyszukuje ciąg znaków wedle wzoru i jeśli wzór wystąpi w ciagu to zwraca prawdę lub fałsz gdy wzór nei pasuje
preg_match_all() podobnie jak wyżej, tylko globalnie
preg_replace() wyszukuje ciag i go zastępuje
preg_split() dzieli ciąg znaków wedle podanego wzoru
preg_grep() wczytuje do tablicy ciągi znaków pasujące do wzoru
preg_ quote() jeśli ciąg zawiera spcjalne znaki typu: *,&,%, itd to ta funkcja je wyłuskuje i pokazuje na ekranie

Wyrażenia regularne - przykłady

  1. Walidacja adresu URL

    Możemy to zrobić korzystając z poniższego kodu:

    					$url = "http://www.piotrnalepa.pl/";
    					if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url))
    					{
    					    echo "Podany URL jest poprawny.";
    					}
    					else
    					{
    					    echo "Podany URL jest błędny.";
    					}


  2. Podświetlanie słowa w tekście strony

    Jest to przydatne, gdy chcemy za każdym razem zwrócić uwagę na jakąś frazę, np. "sport", "dieta" czy jakąkolwiek inną.

    					$text = "Horeszków daleki przyjechawszy z której ramię z dala, ręce ciągnął wzdłuż i westchnień, i Waszeć z Wizgirdem dominikanie z miny, Że ją bardzo szybko, suwała. Białe jej oczyma ciekawymi po łacinie. Mężczyznom dano wódkę. wtenczas wszyscy znali. Kibić miała wysmukłą, kształtną, pierś powabną suknię materyjalną, różową, jedwabną gors wycięty, kołnierzyk.";
    					$text = preg_replace("/b(je)b/i", '<span style="background:#b30000; color: #ffffff;">1</span>', $text);
    					echo $text;


  3. Znajdź wszystkie obrazki na stronie

    Dzięki temu możesz znaleźć wszystkie pliki graficzne na stronie i z pomocą cURL'a można stworzyć aplikację pobierającą obrazki ze strony.

    					$obrazki = array();
    					preg_match_all('/(img|src)=("|')[^"'>]+/i', $dane, $typ);
    					unset($dane);
    					$dane=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$typ[0]);
    					foreach($dane as $url)
    					{
    						$info = pathinfo($url);
    						if (isset($info['rozsz']))
    						{
    							if (($info['rozsz'] == 'jpg') ||
    							($info['rozsz'] == 'jpeg') ||
    							($info['rozsz'] == 'gif') ||
    							($info['rozsz'] == 'png'))
    							array_push($obrazki, $url);
    						}
    					}


  4. Usuwanie powtarzających się słów

    Jeśli często się Tobie zdarza mieć powtórzone słowa w tekście, to ten kawałek kodu może być całkiem przydatny dla Ciebie.

    					$text = preg_replace("/s(w+s)1/i", "$1", $text);

    Dzięki temu, zamiast "Ten tekst jest jest fajny." będzie "Ten tekst jest fajny".


  5. Usuwanie powtarzających się znaków punktuacyjnych

    Podobnie jak wyżej. Tym razem usuwamy powtórzone kropki.

    					$text = preg_replace("/.+/i", ".", $text);


  6. Zamiania cudzysłowiów na apostrofy

    Tak jak w tytule.

    					preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);


  7. Sprawdzenie poprawności wprowadzonego hasła

    Dzięki temu wyrażeniu regularnemu można kontrolowac poprawność wprowadzonego hasła. Ten przykład sprawdza czy hasło ma conajmniej 6 znaków długości oraz czy zawiera jedną dużą literę, jedną małą oraz cyfrę.

    					'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'


  8. Zamiana uśmieszków punktuacyjnych na obrazkowe

    Dzięki temu, możesz zamieniać uśmieszki typu: 🙂 czy 😛 na obrazkowe.

    					$text="Tekst z uśmieszkiem :)";
    					echo str_replace(':)','<img src="usmieszki/happy.png">',$text);


Mam nadzieję, że ten artykuł okazał się pomocny w zrozumieniu po co są wyrażenia regularne oraz jak można je zastosować.

  • Kamil

    Długo szukałem takiego bloga/strony! Wreszcie trafiłem i długo tutaj zostanę. Podoba mi się prostota i czysty przekaz informacji

  • Comandeer

    Wreszcie! Gdzie byłem, to pod hasłem „wyrażenia regularne” opisywana była funckja eregi… Masakra… Odnośnie pierwszego przykładu to szybciej jest użyć funkcji filter_var.

  • Artur

    Czy w przykładzie trzecim można poprawić błędy ??

  • można, ale jakie błędy?

  • Wszystko fajnie, przejrzyście opisane 🙂 Tego właśnie ostatnio szukałem

  • Marcin

    W przykładzie 3 są jakieś błędy…

  • Piotr Nalepa

    to znaczy jakie błędy?

  • wiktor

    ‚/(img|src)=(„|’)[^”‚>]+/i’ <- wpisz sobie to do jakiegoś edytora ze składnią, źle umieściłeś " i '. Nie prasuje tego a wywala błąd stringa.

  • rak

    ^stron$ – ?stron? jako kompletny ciąg znaków, nie występują dodatkowe znaki oprócz zdefiniowanych

    Tu nie o to chodzi – a o to, że mogą wysąpić tylko TE i w TAKIEJ KOLEJNOSCI!!

  • a jak zamienic normalna przerwe „spacje” na podkreslnik „_”
    czyli zamiast „ala miała kota” na „ala_miała_kota”

    pozdrawiam

  • Piotr Nalepa

    można do tego wykorzystać:

    preg_replace(' ', '_', $string);
  • Pionier

    W jaki sposób zamienić ciąg znaków:
    http://ciag_znakow/ciag_znakow/ciag_znakow/ciag_znakow
    żeby wyglądał tak:
    http://ciag_znakow/ciag_znakow/ciag_znakow
    Przy czym ‚ciag_znakow’ jest zawsze inny.
    Czyli np. jeśli ktoś podaje url:
    http://przyklad.pl/abc/cba/klamka
    to żeby zamieniło na:
    http://przyklad.pl/abc/cba
    Pomoże ktoś?

  • Wojtek

    @up, próbowałeś explode ? Ustaw aby „dzielnikiem” był ukośnik, i złóż potem link do kupy, pomijając ostatni element (w twoim przykładzie jest to klamka)

  • marcinos

    Słuchajcie szukam czegoś takiego jak preg_match ale pod javascript

  • Piotr Nalepa

    W JS możesz porównać string ze wzorcem za pomocą:

    var text = 'jakis tekst';
    text.match(/jakis\[(\d+)\]\[(\d+)\]/);

  • Wszedłem na tą stronę w Google’a w poszukiwaniuobsługi wyrażeń regularnych w jQuery… Ale jak widzę powyższy komentarz… to dochodzę do wniosku że może jako takiej nie ma, gdyż w sumnie upraszaczanie funkcji wbudowanej JavaScript’owej funckji .match() może nie miało by sesu 😉