Willkommen zu 2019 und dem /u
Modifikator in Regex, der UTF-8-Multibyte-Zeichen für Sie verarbeitet
Wenn Sie nur verwenden mb_convert_encoding($value, 'UTF-8', 'UTF-8')
, werden immer noch nicht druckbare Zeichen in Ihrer Zeichenfolge angezeigt
Diese Methode wird:
- Entfernen Sie alle ungültigen UTF-8-Multibyte-Zeichen mit
mb_convert_encoding
- Entfernen Sie alle nicht druckbare Zeichen wie
\r
, \x00
(NULL-Byte) und andere Steuer Zeichen mitpreg_replace
Methode:
function utf8_filter(string $value): string{
return preg_replace('/[^[:print:]\n]/u', '', mb_convert_encoding($value, 'UTF-8', 'UTF-8'));
}
[:print:]
\n
Passen Sie alle druckbaren Zeichen und Zeilenumbrüche an und entfernen Sie alles andere
Sie können die ASCII-Tabelle unten sehen. Die druckbaren Zeichen reichen von 32 bis 127, aber Zeilenumbruch \n
ist Teil der Steuerzeichen, die von 0 bis 31 reichen, sodass wir dem regulären Ausdruck Zeilenumbruch hinzufügen müssen/[^[:print:]\n]/u
Sie können versuchen, Zeichenfolgen mit Zeichen außerhalb des druckbaren Bereichs wie \x7F
(DEL), \x1B
(Esc) usw. durch die Regex zu senden und zu sehen, wie sie entfernt werden
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