Bienvenue dans 2019 et le /umodificateur de regex qui gérera les caractères multioctets UTF-8 pour vous
Si vous utilisez uniquement, mb_convert_encoding($value, 'UTF-8', 'UTF-8')vous vous retrouverez toujours avec des caractères non imprimables dans votre chaîne
Cette méthode:
- Supprimez tous les caractères multioctets UTF-8 non valides avec
mb_convert_encoding
- Supprimez tous les caractères non imprimables comme
\r, \x00(NULL-byte) et les autres caractères de contrôle avecpreg_replace
méthode:
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
[:print:]faire correspondre tous les caractères et \nnouvelles lignes imprimables et supprimer tout le reste
Vous pouvez voir le tableau ASCII ci-dessous. Les caractères imprimables vont de 32 à 127, mais le saut de ligne \nfait partie des caractères de contrôle qui vont de 0 à 31, nous devons donc ajouter une nouvelle ligne à l'expression régulière/[^[:print:]\n]/u

Vous pouvez essayer d'envoyer des chaînes via l'expression régulière avec des caractères en dehors de la plage imprimable comme \x7F(DEL), \x1B(Esc) etc. et voir comment ils sont supprimés
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