Comment puis-je supprimer des caractères de contrôle comme STX d'une chaîne PHP? J'ai joué avec
preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString)
mais a constaté que cela enlevait beaucoup trop. Existe-t-il un moyen de supprimer niquement les caractères de contrôle?
Si vous entendez par caractères de contrôle les 2 premiers caractères ascii et \x7F
(qui inclut le retour chariot, etc!), alors cela fonctionnera:
preg_replace('/[\x00-\x1F\x7F]/', '', $input);
(Notez les guillemets simples: avec des guillemets doubles, l'utilisation de \x00
provoque en quelque sorte une erreur d'analyse.)
Le saut de ligne et le retour chariot (souvent écrits \r
et \n
) peut être sauvé de la suppression comme suit:
preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $input);
Je dois dire que je pense que la réponse de Bobby est mieux, dans le sens où [:cntrl:]
transmet mieux ce que fait le code que [\x00-\x1F\x7F]
.
AVERTISSEMENT: ereg_replace
est déconseillé dans PHP> = 5.3.0 et supprimé dans PHP> = 7.0.0 !, veuillez utiliser preg_replace
au lieu de ereg_replace
:
preg_replace('/[[:cntrl:]]/', '', $input);
Pour la saisie Unicode, cela supprimera tous les caractères de contrôle, non affectés, à usage privé, la mise en forme et les points de code de substitution (qui ne sont pas également des caractères d'espacement, tels que tabulation, nouvelle ligne) de votre texte de saisie. J'utilise ceci pour supprimer tous les caractères non imprimables de mon entrée.
<?php
$clean = preg_replace('/[^\PC\s]/u', '', $input);
pour plus d'informations sur \p{C}
voir http://www.regular-expressions.info/unicode.html#category
PHP prend en charge les classes POSIX, vous pouvez donc utiliser [:cntrl:]
au lieu de quelques trucs magiques fantastiques:
ereg_replace("[:cntrl:]", "", $pString);
Modifier:
Une paire supplémentaire de crochets pourrait être nécessaire en 5.3.
ereg_replace("[[:cntrl:]]", "", $pString);
Pour garder les caractères de contrôle mais les rendre compatibles pour JSON, je devais
$str = preg_replace(
array(
'/\x00/', '/\x01/', '/\x02/', '/\x03/', '/\x04/',
'/\x05/', '/\x06/', '/\x07/', '/\x08/', '/\x09/', '/\x0A/',
'/\x0B/','/\x0C/','/\x0D/', '/\x0E/', '/\x0F/', '/\x10/', '/\x11/',
'/\x12/','/\x13/','/\x14/','/\x15/', '/\x16/', '/\x17/', '/\x18/',
'/\x19/','/\x1A/','/\x1B/','/\x1C/','/\x1D/', '/\x1E/', '/\x1F/'
),
array(
"\u0000", "\u0001", "\u0002", "\u0003", "\u0004",
"\u0005", "\u0006", "\u0007", "\u0008", "\u0009", "\u000A",
"\u000B", "\u000C", "\u000D", "\u000E", "\u000F", "\u0010", "\u0011",
"\u0012", "\u0013", "\u0014", "\u0015", "\u0016", "\u0017", "\u0018",
"\u0019", "\u001A", "\u001B", "\u001C", "\u001D", "\u001E", "\u001F"
),
$str
);
(Les règles JSON stipulent: "Tous les caractères Unicode peuvent être placés entre guillemets à l'exception des caractères qui doivent être échappés: guillemet, solidus inversé et les caractères de contrôle (U + 0000 à U + 001F).")