Sumafu: PHP ASCII Zeichen 0 - 31 entfernen

Hallo,

bei meinem aktuellen Projekt kann der Nutzer in einem Feld eine Eingabe machen, die dann in MySQL gespeichert wird. Dabei darf jedes Zeichen benutzt werden, außer die ASCII-Zeichen 0 bis 31 und 127. Gibt es in PHP eine einfache (oder auch nicht ganz so einfache) Möglichkeit, diese Zeichen zu entfernen, ohne die 33 Zeichen für str_replace in einem Array zu speichern? Mit str_replace($array, '', $string) ist es zwar Möglich, aber vielleicht gibt es noch eine bessere Möglichkeit.

akzeptierte Antworten

  1. Moin!

    bei meinem aktuellen Projekt kann der Nutzer in einem Feld eine Eingabe machen, die dann in MySQL gespeichert wird. Dabei darf jedes Zeichen benutzt werden, außer die ASCII-Zeichen 0 bis 31 und 127. Gibt es in PHP eine einfache (oder auch nicht ganz so einfache) Möglichkeit, diese Zeichen zu entfernen, ohne die 33 Zeichen für str_replace in einem Array zu speichern? Mit str_replace($array, '', $string) ist es zwar Möglich, aber vielleicht gibt es noch eine bessere Möglichkeit.

    Zwei grundsätzliche Möglichkeiten fielen mir ein: strtr() und preg_replace()

    strtr() ist im Grundsatz dasselbe, wie dein str_replace, es benötigt für deinen Anwendungsfall ein Transformationsarray mit allen zu ersetzenden ASCII-Codes als Key, und dem Zielwert als Value. Die Funktion berücksichtigt außerdem keine Zeichencodierung, sondern geht von "ein Byte = ein Zeichen" aus, was bei ASCII, ISO-8859-1 oder -15 und UTF-8 bei deinem konkreten Vorhaben allerdings vertretbar wäre. Du kommst allerdings von dem Array kaum weg. Die alternative Aufrufmöglichkeit von strtr() mit zwei Strings als Parameter und der Übersetzung "das X.te Byte im FROM-String ersetzen durch das X.te Byte im TO-String" funktioniert nicht, weil du ja mit "nichts" ersetzen willst - "kein Byte" kann man aber nicht angeben, und wenn die Strings unterschiedlich lang sind, wird bei FROM alles ignoriert, das bei TO kein passendes Zeichen hat.

    preg_replace() erlaubt die Angabe eines regulären Ausdrucks, und obendrein kann es UTF-8 (wenn man es per Modifier aktiviert). Du würdest also den Zeichenbereich "0x00 bis 0x1F plus 0x7F" durch nichts ersetzen - global, mit Unicode.

    Grüße Sven

    1. preg_replace() erlaubt die Angabe eines regulären Ausdrucks, und obendrein kann es UTF-8 (wenn man es per Modifier aktiviert). Du würdest also den Zeichenbereich "0x00 bis 0x1F plus 0x7F" durch nichts ersetzen - global, mit Unicode.

      Das ist genial, Danke!

      1. @@Sumafu

        preg_replace() erlaubt die Angabe eines regulären Ausdrucks, und obendrein kann es UTF-8 (wenn man es per Modifier aktiviert). Du würdest also den Zeichenbereich "0x00 bis 0x1F plus 0x7F" durch nichts ersetzen - global, mit Unicode.

        Das ist genial, Danke!

        s.a. http://stackoverflow.com/questions/1497885/remove-control-characters-from-php-string#1497928

        (Das war übrigens mein erster Suchtreffer.)

        LLAP 🖖

        --
        „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
        „Hat auf dem Forum herumgelungert …“
        (Wachen in Asterix 36: Der Papyrus des Cäsar)