Mb decode numericentity: примеры (PHP)

Обратное преобразование числовых HTML-сущностей с помощью mb_decode_numericentity
Раздел: Многобайтовые строки
mb_decode_numericentity(string $string, array $map, ?string $encoding = null): string
Функция mb_decode_numericentity

Функция mb_decode_numericentity() преобразует числовые HTML-сущности в символы в заданной кодировке. Она используется при обработке текстов, которые были ранее преобразованы функцией mb_encode_numericentity(), например, для безопасной передачи данных или сохранения исходного набора символов.

Аргументы функции
  • $string (string) – исходная строка, содержащая числовые HTML-сущности.
  • $map (array) – массив, определяющий диапазон кодов для преобразования. Формат: array(начало_кода, конец_кода, шаг, базовая_кодировка).
  • $encoding (string, необязательный) – кодировка входной и выходной строки. Если не указана, используется внутренняя кодировка.
  • $is_hex (bool, необязательный) – определяет, являются ли сущности шестнадцатеричными (true) или десятичными (false). По умолчанию false.
Базовые примеры использования
Простое декодирование десятичных сущностей
<?php
$str = 'Алфа';
$map = array(0x80, 0xffff, 0, 'UTF-8');
echo mb_decode_numericentity($str, $map, 'UTF-8');
?>
Алфа
Декодирование шестнадцатеричных сущностей
<?php
$str = 'Алфа';
$map = array(0x80, 0xffff, 0, 'UTF-8');
echo mb_decode_numericentity($str, $map, 'UTF-8', true);
?>
Алфа
Частичное декодирование диапазона
<?php
$str = 'AАBсC';
// Декодируем только кириллические символы (диапазон примерно 0x0400-0x04FF)
$map = array(0x400, 0x4FF, 0, 'UTF-8');
echo mb_decode_numericentity($str, $map, 'UTF-8');
?>
AАBсC
Похожие функции в PHP
  • html_entity_decode() – преобразует все HTML-сущности в символы. В отличие от mb_decode_numericentity, работает с именованными сущностями (например, &amp;) и не требует указания карты.
  • htmlspecialchars_decode() – декодирует только специальные HTML-сущности (&, ", ', <, >).
  • mb_encode_numericentity() – обратная функция, кодирует символы в числовые сущности.

Функцию mb_decode_numericentity предпочтительно использовать, когда нужно декодировать только определённый диапазон символов, ранее закодированный через mb_encode_numericentity.

Типичные ошибки
Неправильная карта (map)
<?php
$str = 'А';
// Неправильный порядок элементов в map
$map = array('UTF-8', 0, 0xffff, 0x80);
echo mb_decode_numericentity($str, $map, 'UTF-8');
?>
Warning: mb_decode_numericentity(): Argument #2 ($map) must contain at least 4 elements
Неподходящая кодировка
<?php
$str = 'А';
$map = array(0x80, 0xffff, 0, 'UTF-8');
// Указана кодировка, несовместимая с символами
echo mb_decode_numericentity($str, $map, 'ASCII');
?>
(символ может отобразиться некорректно или как пустота)
Смешанные типы сущностей при флаге is_hex
<?php
$str = 'Ал';
$map = array(0x80, 0xffff, 0, 'UTF-8');
// Флаг is_hex=true, но первая сущность десятичная
// Декодируется только вторая сущность
var_dump(mb_decode_numericentity($str, $map, 'UTF-8', true));
?>
string(4) "Ал"
Изменения в версиях PHP
  • PHP 8.0: параметр $encoding стал необязательным и перемещён на третью позицию. Добавлен параметр $is_hex на четвёртую позицию.
  • PHP 7.4: функция стала принимать параметр $encoding как четвёртый аргумент (ранее был третьим).
  • PHP 5.6: добавлена поддержка констант кодировок, таких как ISO-8859-1.
Расширенные примеры
Декодирование нескольких диапазонов
Пример php
<?php
$str = 'AАΩω';
// Декодируем латиницу (A-Z, a-z), кириллицу и греческие буквы
$result = $str;
$maps = [
    [0x0041, 0x005A, 0, 'UTF-8'],
    [0x0400, 0x04FF, 0, 'UTF-8'],
    [0x0370, 0x03FF, 0, 'UTF-8']
];
foreach ($maps as $map) {
    $result = mb_decode_numericentity($result, $map, 'UTF-8');
}
echo $result;
?>
ААΩω
Обработка текста с сохранением нечисловых сущностей
Пример php
<?php
$str = 'Цена < €10 & > ₽5';
// Декодируем только числовые сущности для евро и рубля
$map = [0x80, 0xffff, 0, 'UTF-8'];
$decoded = mb_decode_numericentity($str, $map, 'UTF-8');
// Именованные сущности остаются
echo $decoded;
?>
Цена < €10 & > ₽5
Фильтрация нежелательных символов через декодирование
Пример php
<?php
$str = 'Hello😊World👾';
// Декодируем только печатные ASCII-символы, смайлики останутся сущностями
$map = [0x20, 0x7E, 0, 'UTF-8'];
echo mb_decode_numericentity($str, $map, 'UTF-8');
?>
Hello😊World👾
Работа с hex и dec сущностями в одной строке
Пример php
<?php
function decode_mixed($str, $map, $encoding) {
    // Сначала десятичные
    $str = mb_decode_numericentity($str, $map, $encoding, false);
    // Затем шестнадцатеричные
    return mb_decode_numericentity($str, $map, $encoding, true);
}
$str = 'A (dec) and A (hex) are both "A"';
$map = [0x0, 0xFFFF, 0, 'UTF-8'];
echo decode_mixed($str, $map, 'UTF-8');
?>
A (dec) and A (hex) are both "A"
Альтернативы в других языках

Mb decode numericentity в Python

import html
s = 'Алфа'
print(html.unescape(s))
Алфа

Mb decode numericentity в Javascript

let str = 'АлфЮ';
let decoded = str.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec));
console.log(decoded);
АлфЮ

Mb decode numericentity в MySQL

SELECT CAST('АлфЮ' AS CHAR CHARACTER SET utf8);
-- Или с использованием функции:
SELECT CONVERT('АлфЮ' USING utf8);
АлфЮ

Отличия: в других языках обычно есть встроенные функции для общего декодирования HTML-сущностей, но нет точного аналога с декодированием по заданной карте символов.

PHP mb_decode_numericentity function comments

En
Mb decode numericentity Decode HTML numeric string reference to character