Bienvenido a 2019 y al /u
modificador en expresiones regulares que manejará caracteres multibyte UTF-8 por usted
Si solo lo usa mb_convert_encoding($value, 'UTF-8', 'UTF-8')
, aún terminará con caracteres no imprimibles en su cadena
Este método:
- Elimine todos los caracteres multibyte UTF-8 no válidos con
mb_convert_encoding
- Elimine todos los caracteres no imprimibles como
\r
, \x00
(byte NULL) y otros caracteres de control conpreg_replace
método:
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
[:print:]
coincidir con todos los caracteres imprimibles y \n
nuevas líneas y eliminar todo lo demás
Puede ver la tabla ASCII a continuación. Los caracteres imprimibles van de 32 a 127, pero la nueva línea \n
es parte de los caracteres de control que van de 0 a 31, por lo que tenemos que agregar una nueva línea a la expresión regular/[^[:print:]\n]/u
Puede intentar enviar cadenas a través de la expresión regular con caracteres fuera del rango imprimible como \x7F
(DEL), \x1B
(Esc), etc. y ver cómo se eliminan
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
$arr = [
'Danish chars' => 'Hello from Denmark with æøå',
'Non-printable chars' => "\x7FHello with invalid chars\r \x00"
];
foreach($arr as $k => $v){
echo "$k:\n---------\n";
$len = strlen($v);
echo "$v\n(".$len.")\n";
$strip = utf8_decode(utf8_filter(utf8_encode($v)));
$strip_len = strlen($strip);
echo $strip."\n(".$strip_len.")\n\n";
echo "Chars removed: ".($len - $strip_len)."\n\n\n";
}
https://www.tehplayground.com/q5sJ3FOddhv1atpR