mb_decode_numericentity

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_decode_numericentityДекодирует HTML-строку с числовой ссылкой на кодовую точку Юникода в символ

Описание

mb_decode_numericentity(string $string, array $map, ?string $encoding = null): string

Функция преобразовывает числовые ссылки на символы в строке string в символы Юникода, если ссылки входят в заданный блок кодовых точек.

Список параметров

string

Декодируемая строка (string).

map

Параметр map принимает массив, в котором указывается диапазон кодовых точек для преобразования.

encoding

Параметр encoding устанавливает кодировку символов. Функция установит для параметра значение внутренней кодировки символов, если аргумент не передали или передали значение null.

is_hex

Параметр устарел.

Возвращаемые значения

Функция возвращает преобразованную строку (string).

Ошибки

Функция выбрасывает ошибку ValueError, если значение если в параметр map передали аргумент, который не содержит список значений с типом int.

Список изменений

Версия Описание
8.4.0 Функция mb_decode_numericentity() теперь выбрасывает ошибку ValueError, если в параметр map передали аргумент, который не содержит список значений с типом int.
8.0.0 Теперь параметр encoding принимает значение null.

Примеры

Пример #1 Пример формата для установки параметра map

<?php

$convmap
= array(
int start_code1, int end_code1, int offset1, int mask1,
int start_code2, int end_code2, int offset2, int mask2,
// ........
int start_codeN, int end_codeN, int offsetN, int maskN
);
// Значениями start_codeN и end_codeN определяется диапазон кодовых точек Юникода.
// К кодовой точке исходного символа добавляется смещение offsetN и выполняется побитовая операция 'И' со значением маски maskN,
// а полученное значение затем преобразовывается в числовую ссылку на символ.

?>

Пример #2 Пример экранирования строки JavaScript-кода через параметр map

<?php

function escape_javascript_string($str)
{
$map = [
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0, // 49
0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,0,0, // 99
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 149
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 199
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 249
1,1,1,1,1,1,1, // 255
];

// Кодировка символа UTF-8
$mblen = mb_strlen($str, 'UTF-8');
$utf32 = bin2hex(mb_convert_encoding($str, 'UTF-32', 'UTF-8'));

for (
$i=0, $encoded=''; $i < $mblen; $i++) {
$u = substr($utf32, $i * 8, 8);
$v = base_convert($u, 16, 10);

if (
$v < 256 && $map[$v]) {
$encoded .= '\\x' . substr($u, 6,2);
} else if (
$v == 2028) {
$encoded .= '\\u2028';
} else if (
$v == 2029) {
$encoded .= '\\u2029';
} else {
$encoded .= mb_convert_encoding(hex2bin($u), 'UTF-8', 'UTF-32');
}
}

return
$encoded;
}

// Данные для теста
$convmap = [ 0x0, 0xffff, 0, 0xffff ];
$msg = '';

for (
$i=0; $i < 1000; $i++) {
// Функцией chr() невозможно сгенерировать правильные данные в кодировке UTF-8 с кодовыми точками больше 128,
// поэтому вызывается функция mb_decode_numericentity()
$msg .= mb_decode_numericentity('&#' . $i . ';', $convmap, 'UTF-8');
}

// var_dump($msg);
var_dump(escape_javascript_string($msg));

?>

Смотрите также

  • mb_encode_numericentity() - Кодирует символ в HTML-строку с числовой ссылкой на кодовую точку Юникода