you might also enjoy preg_replace_callback() Here is an example using it:
$str='LOREM IPSUM DOLOR SIT AMET CONSECTETUER IPSUM RIDICULUS ÉST PURUS';
$pattern = '/&[A-Z]+;/';
function fixHTMLCode($matches) {
$str = preg_replace('/[^A-Z]/','',$matches[0]);
$str = ucfirst(strtolower($str));
return '&'.$str.';';
}
$newstr = preg_replace_callback($pattern,'fixHTMLCode',$str);
echo $str .'<br>'. $newstr;