Bienvenue dans 2019 et le /u
modificateur 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 \n
nouvelles 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 \n
fait 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