Porady i recenzje · sprawdzone w praktyceNowoczesny serwis poradnikowy · aktualizowany

Start › Technologia

Wyrażenia regularne w PHP: praktyczne podstawy

Technologia · zaktualizowano
Wyrażenia regularne w PHP: praktyczne podstawy

Wyrażenia regularne w PHP przydają się tam, gdzie trzeba szybko wyciągnąć fragment tekstu: adres obrazka z kodu strony, nazwę domeny z długiego odnośnika albo listę znaczników do usunięcia. To narzędzie o wąskim, ale bardzo konkretnym zastosowaniu.

Poniższe przykłady pochodzą z codziennej pracy z treścią HTML i adresami. Nie są kompletnym kursem, a zbiorem gotowych rozwiązań z komentarzem, na co uważać, żeby wzorzec nie działał przypadkiem inaczej, niż zakładasz.

Zanim napiszesz wzorzec

Najpierw przygotuj małą próbkę tekstu: trzy, cztery przypadki, w tym jeden trudny. Wzorzec testowany na jednym przykładzie prawie zawsze działa, a potem sypie się na produkcji, bo w danych pojawia się cudzysłów albo dodatkowy atrybut.

Do testów używaj jednego z serwisów sprawdzających wyrażenia online albo konsoli z funkcją dopasowania. Wynik od razu pokazuje, która grupa została przechwycona, co jest szczególnie ważne przy wzorcach z kilkoma nawiasami.

Wybierz też ogranicznik wzorca świadomie. Ukośnik jest wygodny, ale wtedy każdy ukośnik w treści wymaga poprzedzenia odwrotnym ukośnikiem, co przy adresach robi się nieczytelne. Znak hash albo tylda eliminują połowę tych ucieczek.

Flaga ignorowania wielkości liter przydaje się zawsze przy znacznikach, bo kod HTML bywa pisany wielkimi literami. Flaga trybu minimalnego bywa wygodniejsza niż dopisywanie znaku zapytania przy każdym kwantyfikatorze, zwłaszcza w długich wzorcach.

Adres obrazka z kodu strony

Funkcja dopasowująca zwraca tablicę wyników. Pierwszy element to całe dopasowanie, czyli cały znacznik, a drugi to zawartość pierwszego nawiasu, czyli adres pliku. Ta różnica decyduje o tym, co podstawisz do treści.

Wzorzec buduje się od znacznika, potem dopuszcza dowolne znaki do atrybutu z adresem, przechwytuje wartość w cudzysłowach i domyka znacznik. Kwantyfikator z minimalną liczbą znaków jest tu konieczny, bo w przeciwnym razie dopasowanie przeskoczy do ostatniego obrazka na stronie.

Jeśli chcesz wybrać tylko pliki w wybranych formatach, zawęź grupę do rozszerzenia. Odsianie animowanych obrazków bywa przydatne, bo w starszych układach stron właśnie w tym formacie trzymano przyciski i reklamy, a nie treść.

Uzupełnianie adresów względnych

Strony często zawierają adresy bez domeny. Żeby przenieść treść na inną instalację, trzeba je uzupełnić. Sztuczka polega na negatywnym spojrzeniu w przód: dopasowujemy tylko te wartości, które nie zaczynają się od protokołu.

Uważaj na adresy zaczynające się od dwóch ukośników, które dziedziczą protokół strony, oraz na dane osadzone bezpośrednio w atrybucie. Prosty warunek „nie zaczyna się od http” ich nie obejmie i po podstawieniu otrzymasz niepoprawny adres.

Nazwa domeny z adresu

Usunięcie protokołu, prefiksu i całej ścieżki daje samą domenę, której można użyć jako podpisu odnośnika. Wzorzec składa się z kilku alternatyw rozdzielonych pionową kreską, a funkcja zamienia je na pusty tekst.

  • Usuń protokół wraz z dwukropkiem i ukośnikami.
  • Usuń prefiks przed nazwą domeny.
  • Odetnij wszystko od pierwszego ukośnika ścieżki.
  • Sprawdź wynik na adresie z subdomeną.
  • Sprawdź adres z numerem portu.
ElementCo zrobićPo czym poznać efekt
Grupa przechwytującaWybierz tylko potrzebny fragmentW wyniku jest sam adres
KwantyfikatorUstaw tryb minimalnyDopasowanie kończy się na pierwszym trafieniu
Flaga ignorowania wielkościDodaj do wzorcaDuże litery w znacznikach też pasują
Negatywne spojrzenieWyklucz adresy z protokołemBezwzględne adresy zostają nietknięte
PodstawienieZłóż adres z domeny i grupyOdnośnik prowadzi do pliku

Zamiana adresów w odnośniki

Znalezienie samego adresu w tekście wymaga wzorca obejmującego schemat, nazwę hosta i resztę ścieżki. Trzy grupy pozwalają złożyć znacznik odnośnika, w którym widocznym tekstem jest krótka nazwa domeny, a nie cały długi adres.

Przy podmianie pamiętaj o escapowaniu wartości pochodzących z treści. Adres wstawiony bez kontroli może zamknąć atrybut i wstrzyknąć dowolny kod do strony. To klasyczna luka, a wyrażenie regularne jej nie naprawi, jeśli sam nie zadbasz o oczyszczenie danych.

Usuwanie znaczników z wyjątkami

Często trzeba wyczyścić treść ze wszystkich znaczników poza kilkoma dozwolonymi. Rozwiązaniem jest negatywne spojrzenie w przód, które przepuszcza tylko elementy z listy, a resztę usuwa jednym przebiegiem.

To wygodne, ale nie jest pełnym filtrem bezpieczeństwa. Znaczniki bez domknięcia, atrybuty ze skryptami i komentarze warunkowe potrafią przejść przez taki wzorzec. Do treści pochodzącej od użytkowników używaj biblioteki lub sanitizera, a nie własnego wyrażenia.

Kiedy odpuścić

Jeśli struktura dokumentu jest zagnieżdżona i nieregularna, wyrażenie regularne szybko przestaje wystarczać. Wtedy lepszy jest parser drzewa dokumentu, który rozumie hierarchię elementów i nie gubi się przy niepoprawnym kodzie.

Wyrażenia regularne zostaw do pojedynczych, przewidywalnych fragmentów: adresów, atrybutów, nazw. Ta granica jest najważniejszą umiejętnością w tej dziedzinie i chroni przed tygodniami debugowania wzorca, który „prawie” działa.

Bezpieczeństwo przede wszystkim. Odłącz zasilanie, zanim otworzysz obudowę urządzenia. Instalacje gazowe i elektryczne pod napięciem powierz uprawnionemu serwisowi. Ten serwis nie ponosi odpowiedzialności za samodzielnie wykonane naprawy.

Przeczytaj także

Technologia

Komputer przestał działać: jak diagnozować

Czarny ekran, brak zasilania, restart — systematyczna diagnoza krok po kroku.

Technologia

Dyski sieciowe NAS w domu: konfiguracja

Wybór dysków, macierz, udziały i zdalny dostęp bez zdawania się na chmurę.

Technologia

Konsola: błąd autoryzacji płyty i co zrobić

Dlaczego gra przestaje się uruchamiać i jak sprawdzić nośnik oraz napęd.