PHP: Usuwanie atrybutów w tagach HTML

Miałem dziś do zrobienia nieciekawe zadanie. Pliki HTML, sztuk około 40, pochodzenie: wyeksportowane z MS Word. Jak łatwo się domyślić, były pełne wszelkiego typu śmieci, mimo iż były eksportowane jako „Strona sieci Web, Przefiltrowana”. Kod nie był aż taki straszny, natomiast znaczniki (zwane też Tagami) HTML były pełne bezsensownych atrybutów typu algin, class, font itp. Które zupełnie były nie potrzebne. Ku ścisłości, te pliki zawierały tylko konkretną treść, na szczęście nie posiadały layoutu z Worda.

Trzeba było sobie z tym jakoś poradzić, ale szukaj i zmień w każdym pliku po kolei to zbyt wiele roboty. Szybka decyzja – trzeba napisać skrypt w PHP, który zrobi to za mnie.

Sprawa była prosta. Pobrać wszystkie pliki z katalogu funkcją readdir() i powywalać niepotrzebne znaczniki HTML funkcją strip_tags(). Problem pojawił się dopiero przy usuwaniu zbędnych atrybutów. Na php.net znalazłem kilka ciekawych przykładów, ale żaden jakoś mi nie odpowiadał. Zrobiłem to tak:

W zmiennej $junk zapisałem wszystkie atrybuty które chce usunąć:

$junk = 'style|STYLE|class|CLASS|align|ALIGN';

Następnie stworzyłem wyrażenie regularne do usunięcia tych atrybutów:

$delete = '/([\s]+)('.$junk.')([\s]*)=([\s]*)(("|\')([^"\']+)("|\')|([^>"\']+))*/';

A potem już tylko je usunąłem funkcją preg_replace():

$text = preg_replace($delete, '', $text);

Oczywiście w zmiennej $text znajduje się zawartość całego kodu HTML.

Zapewne to wszystko można zrobić jakimś sprytnym programem, ale prawdę mówiąc miałem pretekst żeby wreszcie poznać czym są wyrażenia regularne! Zawsze wydawały mi się czarną magią, ale jak już się je przyswoi, okazują się bardzo przydatne.

Więcej na temat wyrażeń regularnych (ang. regular expressions, w skrócie regex) można przeczytać na stronie evolt.org, gdzie znajduje się ładny opis.