Provato e funzionante
Algoritmo: Divido il testo in pezzi, separando i tag dal resto del testo. Per ogni tag cerco se c'è il tag che chiude, altrimenti è un tag aperto.
Codice PHP:
$testo = str_replace("/>",">",$testo);
$tag_open = strpos($testo,"<");
while($tag_open!==false){
if($tag_open!=0){
$pezzi[] = substr($testo,0,$tag_open);
$testo = substr($testo,$tag_open);
}else{
$tag_close = strpos($testo,">");
$pezzi[] = substr($testo,0,$tag_close+1);
$testo = substr($testo,$tag_close+1);
}
$tag_open = strpos($testo,"<");
}
if(strlen($testo)>0)
$pezzi[] = $testo;
for($i=0;$i<count($pezzi);$i++){
if(eregi("< *([a-z]+)",$pezzi[$i],$regs)){ // EDIT avevo messo ([a-z])+
$chiuso = 0;
$eregi = "< */ *{$regs[1]} *>";
for($j=$i+1;$j<count($pezzi);$j++){
if(eregi($eregi,$pezzi[$j])){
$chiuso = 1;
break;
}
}
if($chiuso==0)
$pezzi[$i] = str_replace(">"," />",$pezzi[$i]);
}
}
$testo = implode("",$pezzi);