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.
| Element | Co zrobić | Po czym poznać efekt |
|---|---|---|
| Grupa przechwytująca | Wybierz tylko potrzebny fragment | W wyniku jest sam adres |
| Kwantyfikator | Ustaw tryb minimalny | Dopasowanie kończy się na pierwszym trafieniu |
| Flaga ignorowania wielkości | Dodaj do wzorca | Duże litery w znacznikach też pasują |
| Negatywne spojrzenie | Wyklucz adresy z protokołem | Bezwzględne adresy zostają nietknięte |
| Podstawienie | Złóż adres z domeny i grupy | Odnoś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.
Przeczytaj także
Komputer przestał działać: jak diagnozować
Czarny ekran, brak zasilania, restart — systematyczna diagnoza krok po kroku.
Dyski sieciowe NAS w domu: konfiguracja
Wybór dysków, macierz, udziały i zdalny dostęp bez zdawania się na chmurę.
Konsola: błąd autoryzacji płyty i co zrobić
Dlaczego gra przestaje się uruchamiać i jak sprawdzić nośnik oraz napęd.