Bene, rimuovere le entità e utilizzare un set di caratteri multibyte!
$string = html_entity_decode($string, ENT_COMPAT, 'UTF-8');
$string = mb_convert_case($string, MB_CASE_UPPER, 'UTF-8');
Quindi inviare la stringa. Non è necessario per la maggior parte delle entità html, basta usare i caratteri nativi e impostare correttamente l'output del documento.
Se davvero si deve utilizzare le entità, una regex è in ordine:
$callback = function($match) {
return strtoupper($match[1]);
}
$regex = '/(\w+(?=&)|(?<=;)\w+)/';
$string = preg_replace_callback($regex, $callback, $string);
Si noti che non ho ancora testato che regex, ma dovrebbe funzionare dal momento che è alla ricerca di lettere che non sono immediatamente seguiti da un personaggio ;
...
grazie! Avrei dovuto pensarci! – laukok
L'unico svantaggio è che non ti aiuterà a risolvere lo stesso problema nel tag title –