Puoi far sistemare a tidy il codice HTML. Io lo uso per elaborare con le funzioni XML i file HTML scaricati da uno spider.

In alternativa, per il tuo problema, puoi utilizzare una soluzione come questa:

1. Una espressione regolare per estrarre tutti i tag (sia apertura che chiusura) inserendone solo i nomi in un unico array.
2. Filtri dall'array i tag tipo br, hr etc.
3. Esegui un ciclo dall'inizio alla fine nel quale quando trovi la chiusura di un tag aperto in precedenza, li rimuovi entrambi. In questo modo alla fine dovresti avere un array con i tag non chiusi nell'ordine in cui sono stati aperti. Ti basta ciclare all'indietro dalla fine dell'array e chiuderli.