mb_scrub

(PHP 7 >= 7.2.0, PHP 8)

mb_scrubReemplaza las secuencias de bytes mal formadas por el carácter de sustitución.

Descripción

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

Realiza una conversión de juego de caracteres desde la codificación especificada, o desde la codificación por omisión si no se ha especificado ninguna, hacia la misma codificación. Esto tiene como efecto reemplazar cualquier secuencia de bytes inválida por el carácter de sustitución.

Parámetros

string

La cadena de entrada.

encoding

La codificación utilizada para interpretar string. Si se omite o es null, el parámetro mbstring.internal_encoding será utilizado si está definido, de lo contrario el parámetro default_charset será utilizado.

Valores devueltos

El resultado string con las secuencias de bytes inválidas reemplazadas.

Historial de cambios

Versión Descripción
8.0.0 encoding ahora acepta null.

Ejemplos

Ejemplo #1 Reemplazo a nivel de byte realizado por mb_scrub()

Aquí se utiliza bin2hex() porque los terminales, navegadores y fuentes pueden renderizar una secuencia de bytes mal formada con un carácter de sustitución propio, ocultando lo que la cadena contiene realmente.

<?php

// El byte 0xFF no puede aparecer en una cadena UTF-8 válida.
$input = "A\xFFB";
echo bin2hex($input), "\n";

// El carácter de sustitución por defecto es "?" (0x3F).
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";

// U+FFFD REPLACEMENT CHARACTER se codifica como EF BF BD en UTF-8.
mb_substitute_character(0xFFFD);
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";

?>

El ejemplo anterior mostrará:

41ff42
413f42
41efbfbd42

Ejemplo #2 Usar mb_scrub() antes de un procesamiento consciente de UTF-8

Los patrones PCRE con el modificador u rechazan los sujetos que no son UTF-8 bien formado. Limpiar la entrada primero la hace aceptable.

<?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));

?>

El ejemplo anterior mostrará:

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

Véase también

add a note

User Contributed Notes 1 note

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

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