Bueno, elimine las entidades y use un conjunto de caracteres de varios bytes.
$string = html_entity_decode($string, ENT_COMPAT, 'UTF-8');
$string = mb_convert_case($string, MB_CASE_UPPER, 'UTF-8');
A continuación, emita la secuencia. No es necesario que exista la mayoría de las entidades html, solo use los caracteres nativos y establezca el resultado del documento correctamente.
Si realmente tiene que utilizar las entidades, una expresión regular está en orden:
$callback = function($match) {
return strtoupper($match[1]);
}
$regex = '/(\w+(?=&)|(?<=;)\w+)/';
$string = preg_replace_callback($regex, $callback, $string);
Tenga en cuenta que no he probado que la expresión regular, pero debería funcionar, ya que está en busca de letras que no son seguidos inmediatamente por un personaje ;
...
gracias! ¡Debería haber pensado en eso! – laukok
La única desventaja es que no le ayudará a resolver el mismo problema en la etiqueta del título –