Попытка разобрать или проверить HTML - сложная задача, которую лучше не пытаться использовать с помощью регулярного выражения. Слишком много возможностей для его эффективности.
Якуб добрался до меня, но я согласен. Используйте инструменты, которые существуют для работы, как HTML Tidy - http://tidy.sourceforge.net/
Он может исправить недопустимый HTML, хороший обзор на http://www.w3.org/People/Raggett/tidy/
Есть некоторая интеграция PHP на http://uk3.php.net/tidy