por lo visto quieres evitar anidaciones, yo pienso que primero deberias hacer un SPLIT a todo el string
algo como
Código PHP:
Ver original<?php
$lineas = split("<font",$html); foreach($lineas as &$linea){
if(stripos($linea,'</font') >0)){ //todo correcto tiene cierre del TAG
}else{//no tiene cierre del TAG y le agregamos uno por que la siguiente linea viene otro FONT
$lineas .= '</font>'
}
}
//y volvemos a armar de nuevo el string
bueno eso es un ejemplo stricto, ya que tambien puede surgir ciertos casos como '<Font' <FONT , etc u otras etiquetas, todo depende de tu imaginacion, un implode puede ser mas util que una expresion regular la expresion regular consume mas recursos que un strpos ,explode
tenlo en cuenta
puedes consultar
https://www.php.net/strpos https://www.php.net/explode
y el favorito
https://www.php.net/manual/es/function.strip-tags.php