Как найти в тексте 16-ричные коды символов и заменить их на сами символы?

Есть функция, которая заменяет эмодзи в тексте на hex-последовательности.

function convertEmoji(string $text, ?string $encoding = 'UTF-8'): string
{
    $emoTypes = [
        '/[\x{1F600}-\x{1F64F}]/u', // Match Emoticons
        '/[\x{1F300}-\x{1F5FF}]/u', // Match Miscellaneous Symbols and Pictographs
        '/[\x{1F680}-\x{1F6FF}]/u',// Match Transport And Map Symbols
        '/[\x{2600}-\x{26FF}]/u', // Match Miscellaneous Symbols
        '/[\x{2700}-\x{27BF}]/u', // Match Dingbats
    ];
        
    $clean_text = "";
    foreach ($emoTypes as $pattern)
    {
        $clean_text = preg_replace_callback($pattern, function ($matches) use ($encoding) {
            return '\x'.base_convert(mb_ord($matches[0], $encoding), 10, 16);
        }, empty($clean_text) ? $text : $clean_text);
    }
        
    return $clean_text;
}
$converted = convertEmoji("Hello ??? люди");
var_dump($converted);//string(36) "Hello \x1f600\x1f4e7\x1f600 люди"
//var_dump(goBack($converted)); // "Hello ??? люди"

Как теперь при выводе этого текста раскодировать их обратно, например из \x1F600 в ?? Какое должно быть регулярное выражение для поиска и замены, может выгоднее сделать через форматирование строки sprintf?


Ответы (0 шт):