Как найти в тексте 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
?