(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_decode_numericentity — Декодирует числовые HTML-сущности в символы
Функция преобразовывает числовые HTML-сущности строки 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));
?>