web-dev-qa-db-ja.com

PHP stringから制御文字を削除します

PHP文字列からSTXのような制御文字を削除するにはどうすればよいですか?

preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString)

しかし、それははるかに道を削除することがわかった。 only制御文字を削除する方法はありますか?

57
KB22

制御文字を意味する場合、 最初の32個のASCII文字と\x7F (キャリッジリターンなどを含む!)、これは動作します:

preg_replace('/[\x00-\x1F\x7F]/', '', $input);

(一重引用符に注意してください:二重引用符では、\x00は、何らかの理由で解析エラーを引き起こします。

改行と復帰(多くの場合\rおよび\n)次のように削除から保存される場合があります。

preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $input);

Bobby's answer は、 [:cntrl:] は、コードが何をするかを[\x00-\x1F\x7F]

警告:ereg_replace は、PHP> = 5.3.0で廃止され、PHP> = 7.0.0!で削除されました!、preg_replace の代わりに ereg_replace

preg_replace('/[[:cntrl:]]/', '', $input);
96
Stephan202

Unicode入力の場合、これにより、入力テキストからすべての制御文字、未割り当て、私的使用、書式設定、およびサロゲートコードポイント(タブ、改行などのスペース文字でもない)が削除されます。これを使用して、入力からすべての印刷不能文字を削除します。

<?php
$clean = preg_replace('/[^\PC\s]/u', '', $input);

\p{C}の詳細については、 http://www.regular-expressions.info/unicode.html#category を参照してください。

35
Scott Jungwirth

PHPはPOSIXクラスをサポートしているため、[:cntrl:]いくつかの派手なキャラクターの魔法の代わりに:

ereg_replace("[:cntrl:]", "", $pString);

編集:

5.3では、角括弧の追加ペアが必要になる場合があります。

ereg_replace("[[:cntrl:]]", "", $pString);
20
Bobby

制御文字を保持しながら、JSONと互換性を持たせるには、

$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
);

(JSONルールの状態:「エスケープする必要がある文字を除くすべてのUnicode文字を引用符で囲むことができます:引用符、逆ソリッド、および制御文字(U + 0000〜U + 001F)。」)

5
Jamie