Dzisiaj krótka recepta, na pozbywanie się z tekstu pustych tagów html. Jest to przydatne na przykład gdy używamy TinyMCE, który czasami poza naszą kontrolą wstawia tagi, które mają w CSS’ie ustawiony margines lub padding – wtedy tekst będzie nienaturalnie porozciągany w takich miejscach. Aby to osiągnąć, skorzystamy z funkcji preg_replace i odpowiedniego wyrażenia regularnego.

$text = '<h1 style="color:red">Header</h1>';
$text.= '<h1 style="color:red"></h1>';
$text.= '<div style="padding: 50px" class="dummy">Dummy text</div>';
$text.= '<div style="padding: 50px" class="dummy"></div>';
$text = preg_replace('#<(w+)s?[^>]*></1>#', '', $text);

Po takiej operacji zmienna $text będzie zawierała:

<h1 style="color:red">Header</h1><div style="padding: 50px" class="dummy">Dummy text</div>

czyli tekst oczyszczony z pustych tagów.

Krótkiego wyjaśnienia wymaga wzorzec, jakiego użyłem w preg_replace. Na początku szukamy co najmniej jednego słowa (w+) i przechwytujemy go, ujmując w nawiasy. Następnie może (ale nie musi) wystąpić biały znak (s – np. spacja), a po nim dowolny ciąg znaków, nie zawierający znaku > (np. style=”color:red”), lub pusty łańcuch znaków. Potem zamykamy tag, otwieramy nowy tag zamykający i używamy pierwszego backreference (1), czyli wyrażenia, które przechwyciliśmy nawiasami na początku wyrażenia regularnego. Pozwala nam to wykryć zamknięcie takiego samego znacznika.