Replaces 'ill-formed' byte sequences with '?'.
See: https://github.com/php/php-src/pull/1099(PHP 7 >= 7.2.0, PHP 8)
mb_scrub — Заменяет неправильно сформированные последовательности байтов символом-заменителем
Функция заменяет во входной строке недопустимые для заданной кодировки — или для кодировки по умолчанию, если кодировку не указали, — байтовые последовательности символом-заменителем.
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)
Replaces 'ill-formed' byte sequences with '?'.
See: https://github.com/php/php-src/pull/1099