Декодирует числовые HTML-сущности в символы

# mb_decode_numericentity

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

mb_decode_numericentity — Декодирует числовые HTML-сущности в символы

### Описание

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

Функция преобразовывает числовые HTML-сущности строки `string` в символы на основе диапазонов кодовых точек.

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

`string`

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

`map`

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

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

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

Функция возвращает преобразованную строку (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-сущности

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open