Arkadaşlar mantık geliştirme açısından güzel ancak öyle substr vs. ile olacak iş değil. Bir üstteki mesajımda belirttiğim gibi preg_match_all ile yapılması en kısa yolu, bir örnek ekliyorum, kendinize göre geliştirirsiniz:
$text = '<h3>başlık3</h3>öylesine yazı<b>bold yazı <p>paragraf';
if(preg_match_all('/(<[^\>\/]*\>)?([^<\>]+)(<\/[^\>\/]*\>)?/smi',$text,$al)){
$say = count($al[1]);
for($i=0;$i<$say;$i++){
$yeni .= ($al[1][$i] != '') ? $al[1][$i].$al[2][$i].str_replace('<','</',$al[1][$i]) : $al[2][$i];
}
}
echo $yeni;