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

Функция преобразовывает числовые 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));

?>

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