Это не так сложно сделать с правильным HTML-анализатором, таким как Nokogiri , который может выполнять очистку как часть метода обработки:
bad_html = '<div><p><strong>bad</p>'
puts Nokogiri.fragment(bad_html).to_s
# <div><p><strong>bad</strong></p></div>
После правильного анализа у вас должны быть полностью сбалансированные теги.