Il modulo DOM di PHP contiene le funzionalità per manipolare gli oggetti dom: la classe radice è "DOMDocument", al quale può essere dato in pasto un testo in formato HTML o XML da decodificare e quindi elaborare come preferiamo.
Questa classe ha purtroppo dei noti problemi con il supporto a testi UTF-8 (e quando mai...).
Provate ad esempio questo codice, che in teoria non dovrebbe fare nulla (decodifica la stringa passata e la ricodifica senza farci nulla).
$content = '<html><body>Verrà il giorno che non ci saranno problemi di encoding</body></html>';
$document = new \DOMDocument('1.0');
$document->loadHTML($content);
$out = $document->saveHTML();