strip_tags
strip_tags($string, $allowed_tags)
Usuwa z tekstu znaczniki HTML, komentarze i znaczniki PHP i zwraca czysty tekst. Przydaje się do streszczenia albo opisu meta z treści HTML artykułu. Do ochrony wyjścia przed atakami XSS nie wystarcza.
Parametry
- $string – tekst ze znacznikami.
- $allowed_tags – opcjonalny, znaczniki, które mają zostać w tekście. Zapisuje się je jako ciąg "<p><strong>", od PHP 7.4 także jako tablicę nazw.
Przykłady
echo strip_tags("<p>Witaj <strong>świecie</strong></p>"); // Witaj świecie
// dozwolone znaczniki
echo strip_tags("<p>Witaj <strong>świecie</strong></p>", "<strong>"); // Witaj <strong>świecie</strong>
// od PHP 7.4 dozwolone znaczniki można przekazać jako tablicę
echo strip_tags("<p>Witaj <em>świecie</em><br></p>", array("em", "br")); // Witaj <em>świecie</em><br>
// usuwa także komentarze
echo strip_tags("Tekst<!-- komentarz --> dalej"); // Tekst dalej
// zawartość znaczników style i script zostaje w tekście
echo strip_tags("<style>p{color:red}</style>Tekst<script>alert(1)</script>"); // p{color:red}Tekstalert(1)
// znaczniki znikają bez śladu – słowa sąsiednich akapitów się zlewają
echo strip_tags("<p>Pierwszy</p><p>Drugi</p>"); // PierwszyDrugi
echo trim(preg_replace('/\s+/', " ", strip_tags(str_replace("<", " <", "<p>Pierwszy</p><p>Drugi</p>")))); // Pierwszy Drugi
// znak < w zwykłym tekście funkcja uważa za początek znacznika
echo strip_tags("x<5 i y>3"); // x3
// dozwolony znacznik zachowuje wszystkie swoje atrybuty
echo strip_tags('<a href="#" onclick="alert(1)">Link</a>', "<a>"); // <a href="#" onclick="alert(1)">Link</a>
// streszczenie z tekstu HTML
echo mb_substr(strip_tags("<p>Długi <b>tekst</b> o funkcjach.</p>"), 0, 11) . "…"; // Długi tekst…
Na co uważać
- Nie chroni przed XSS. Dozwolony znacznik zachowuje wszystkie swoje atrybuty, łącznie z onclick i linkami z javascript:. Tekst na stronę zabezpieczaj przez htmlspecialchars(); jeśli użytkownicy mogą wstawiać HTML, użyj biblioteki stworzonej do tego celu (na przykład HTML Purifier).
- Usuwane są tylko znaczniki. Zawartość znaczników <script> i <style> zostaje w tekście jako zwykły tekst.
- Znak < w czystym tekście („x<5”) funkcja uważa za początek znacznika i kasuje tekst za nim aż do najbliższego >. Jeśli znaku zamykającego brak, znika reszta tekstu.
- Encji nie zamienia: <b> zostaje bez zmian. Na czysty tekst zamienia je html_entity_decode().
- Znaczniki znikają bez śladu, koniec akapitu zlewa się więc z początkiem następnego. Dlatego przed usunięciem wstaw spację przed znaczniki, jak w przykładzie.
Powiązane funkcje:
htmlspecialchars()
nl2br()
preg_replace()