mb_scrub

(PHP 7 >= 7.2.0, PHP 8)

mb_scrub — Заменяет неправильно сформированные последовательности байтов символом-заменителем

Описание

function mb_scrub(string $string, ?string $encoding = null): string

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

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

string

Входная строка.

encoding

Кодировка для интерпретации параметра string. При пропуске значения или передаче null функция возьмёт значение директивы mbstring.internal_encoding, если установили, иначе строка интерпретируется в кодировке из директивы default_charset.

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

Функция возвращает результат в виде строки (string) с заменёнными недопустимыми последовательностями байтов.

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

Версия Описание
8.0.0 Параметр encoding теперь принимает значение null.

Примеры

Пример #1 Пример замены некорректных для UTF-8 байтовых последовательностей функцией mb_scrub()

В примере функцию bin2hex() вызывают из-за отрисовки некорректной последовательности байтов терминалами, браузерами и шрифтами своим символом замены, который скрывает фактическое содержимое строки.

<?php

// Байт 0xFF не встречается в корректно закодированной в UTF-8 строке.
$input = "A\xFFB";
echo bin2hex($input), "\n";

// Символ замены по умолчанию — "?" (0x3F).
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";

// Символ U+FFFD REPLACEMENT CHARACTER кодируется в UTF-8 последовательностью байтов EF BF BD.
mb_substitute_character(0xFFFD);
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";

Результат выполнения приведённого примера:

41ff42
413f42
41efbfbd42

Пример #2 Пример исправления неправильно закодированной в UTF-8 строки функцией mb_scrub()

PCRE-шаблоны с модификатором u отклоняют строки с некорректной для UTF-8 последовательностью байтов. Предварительная очистка входной строки исправляет недопустимые для UTF-8 последовательности байтов.

<?php

$input = "A\xFFB";

var_dump(preg_match_all('/./us', $input));
echo preg_last_error_msg(), "\n";

$clean = mb_scrub($input, 'UTF-8');

var_dump(preg_match_all('/./us', $clean));

Результат выполнения приведённого примера:

bool(false)
Malformed UTF-8 characters, possibly incorrectly encoded
int(3)

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

  • mb_substitute_character() - Устанавливает или получает символ замены
  • mb_check_encoding() - Проверяет, допустима ли строка для заданной кодировки
  • mb_convert_encoding() - Преобразовывает строку из одной кодировки символов в другую
+Добавить

Примечания пользователей 1 note

up
22
Sammitch
8 years ago
Replaces 'ill-formed' byte sequences with '?'.

See: https://github.com/php/php-src/pull/1099