web-dev-qa-db-fra.com

Supprimer les caractères de contrôle de la chaîne PHP

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?

57
KB22

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);
96
Stephan202

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

35
Scott Jungwirth

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);
20
Bobby

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).")

5
Jamie