Benvenuto nel 2019 e il /umodificatore in regex che gestirà i caratteri multibyte UTF-8 per te
Se usi solo, mb_convert_encoding($value, 'UTF-8', 'UTF-8')ti ritroverai comunque con caratteri non stampabili nella stringa
Questo metodo:
- Rimuovi tutti i caratteri multibyte UTF-8 non validi con
mb_convert_encoding
- Rimuovi tutti i caratteri non stampabili come
\r, \x00(NULL-byte) e altri caratteri di controllo conpreg_replace
metodo:
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
[:print:]abbina tutti i caratteri stampabili e le \nnuove righe e rimuove tutto il resto
Puoi vedere la tabella ASCII qui sotto .. I caratteri stampabili vanno da 32 a 127, ma la nuova riga \nfa parte dei caratteri di controllo che vanno da 0 a 31 quindi dobbiamo aggiungere una nuova riga alla regex/[^[:print:]\n]/u

Puoi provare a inviare stringhe attraverso la regex con caratteri al di fuori dell'intervallo stampabile come \x7F(DEL), \x1B(Esc) ecc. E vedere come vengono rimossi
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