$foo = preg_replace('#\\\u\{(.*?)\}#', '&#x$1;', $emoji);
\ u необходимо экранировать, потому что оно имеет особое значение в регулярном выражении, и поскольку обратная косая черта также имеет особое значение в текстовых литералах PHP, нам нужно три из них здесь.
{и} также имеют особое значение, поэтому их нужно экранировать с помощью одной обратной косой черты.
(. *?) Соответствует всему (ожидайте переводы строки),? делает его неловким.
Я добавил; в конце замены - браузеры отказоустойчивы, когда его нет, но это технически требуется синтаксисом HTML.
И «другое направление» в соответствии с просьбой:
$emojihtml = '🧑💬';
$bar = preg_replace('~&#x(.*?);~', '\u{$1}', $emojihtml);
(здесь я использовал ~
для разделителей регулярных выражений, потому что #
является частью того, что мы хотим сопоставить, экономит при экранировании.)