Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

HTML w PHP: echo, heredoc, nowdoc i wyjście z PHP

HTML w PHP: echo, heredoc, nowdoc i wyjście z PHP

Wklej gotowe znaczniki — dostaniesz pięć wariantów tego, jak włożyć je do pliku PHP, każdy z właściwym escapowaniem. Wszystko wykonuje się w Twojej przeglądarce: znaczniki nigdzie nie są wysyłane ani zapisywane.

Przeciągnij tutaj plik .html — jest czytany lokalnie.
Obróbka znaczników

Najbliżej tego, co daje codebeautify, ale z escapowaniem: bez niego dowolny apostrof w znacznikach łamie łańcuch PHP.

Wklej HTML powyżej — kod PHP pojawi się tutaj.

Znaczniki nie opuszczają Twojej przeglądarki — przekształcenie wykonuje się lokalnie, bez wysyłania na serwer.

Pięć sposobów i kiedy który pasuje

echo wierszami — wiersz po wierszu, każdy osobnym wywołaniem. Najbardziej przywykły widok, wygodny, gdy między wierszami trzeba wstawić warunek albo pętlę. nowdoc — blok, w którym PHP nie interpretuje niczego: ani sekwencji ucieczki, ani zmiennych. Znaczniki trafiają do kodu bajt w bajt i nie wymagają escapowania w ogóle. To najbezpieczniejszy sposób przeniesienia cudzego HTML-a. heredoc — ten sam blok, ale ze zmiennymi: $title w środku zostanie podstawione. Dlatego znak dolara i ukośnik wsteczny są escapowane, a cudzysłowy nie. Łańcuch w zmiennej — znaczniki zbierane są do $html konkatenacją. Potrzebne, gdy trzeba je zwrócić z funkcji albo przekazać do szablonizatora, a nie wypisać od razu. Wyjście z PHP — zamknąć znacznik i oddać znaczniki jak są. Właśnie to radzi dokumentacja PHP: żadnego escapowania, żadnych kosztów sklejania łańcuchów, a podświetlanie składni w edytorze pozostaje sprawne. Zamykającego znacznika ?> w wygenerowanym kodzie nie ma celowo. Dowolny znak po nim — nawet przypadkowe przełamanie wiersza na końcu pliku — trafia do wyjścia i daje klasyczne «headers already sent».

Dlaczego konwertery bez escapowania dają niedziałający kod

Najbardziej rozpowszechniony konwerter HTML na PHP robi dokładnie jedno: tnie tekst na wiersze i skleja echo '<wiersz>';. Żadnej zamiany znaków tam nie ma, i widać to na pierwszym prawdziwym kawałku znaczników. Atrybut w pojedynczych cudzysłowach — <a href='/price'> — zamyka łańcuch PHP w środku tekstu. Dalej idzie błąd składni. Ukośnik wsteczny na końcu wiersza zjada zamykający cudzysłów i skleja dwa wiersze w jeden. Znak dolara w podwójnych cudzysłowach albo w heredoc zamienia $total w pustą wartość. trim() na każdym wierszu po cichu ścina wcięcia wewnątrz pre, textarea i code — na stronie zmienia się to, co widzi odwiedzający. Wszystkie wiersze sklejają się bez przełamań, więc wynikowy HTML staje się jednym nieskończonym wierszem. Tutaj każdy z tych przypadków jest obsłużony, a etykieta heredoc dobierana jest tak, by nie zbiec się z żadnym wierszem Twoich znaczników: inaczej blok zamknąłby się w środku.

Częste pytania