Ну, удалите сущности и используйте многобайтовый набор символов!
$string = html_entity_decode($string, ENT_COMPAT, 'UTF-8');
$string = mb_convert_case($string, MB_CASE_UPPER, 'UTF-8');
Затем выведите строку. Нет необходимости в большинстве html-сущностей, просто используйте нативные символы и правильно установите вывод документа.
Если вы действительно должны использовать сущности, регулярное выражение в следующем порядке:
$callback = function($match) {
return strtoupper($match[1]);
}
$regex = '/(\w+(?=&)|(?<=;)\w+)/';
$string = preg_replace_callback($regex, $callback, $string);
Обратите внимание, что я не проверял это регулярное выражение, но оно должно работать, так как он ищет буквы, за которыми сразу не следует символ ;
...