Как это будет выглядеть с использованием preg_replace_callback?
$str = preg_replace('/\&\#([0-9]+)\;/me', "code2utf('\\1',{$lo})", $str);





Если я не ошибаюсь, вы хотите использовать preg_replace_callback вместо Модификатор /e.
Если вы хотите передать дополнительные параметры функции обратного вызова, вы можете использовать Идентификатор use или обернуть обратный вызов в другая функция.
Второй пример мог бы выглядеть так:
$str = preg_replace_callback(
'/\&\#([0-9]+)\;/m', function ($matches) use ($lo) {
// function body with return statement
}, $str
);
Заметки
Ваше регулярное выражение \&\#([0-9]+)\; будет соответствовать строке типа 𸽵. Я думаю, вам не нужно извлекать & и #.
В вашем коде вы используете return strtoupper($matches[1], $lo);, но strtoupper принимает один параметр вместо двух.
Если это то, что вы хотите сопоставить, то при запуске ваш код вы можете увидеть, что $matches[1] содержит "233333", поэтому он будет называться return strtoupper("233333");.