PHP文字列からSTXのような制御文字を削除するにはどうすればよいですか?
preg_replace("/[^a-zA-Z0-9 .\-_;!:?äÄöÖüÜß<>='\"]/","",$pString)
しかし、それははるかに道を削除することがわかった。 only制御文字を削除する方法はありますか?
制御文字を意味する場合、 最初の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);
Unicode入力の場合、これにより、入力テキストからすべての制御文字、未割り当て、私的使用、書式設定、およびサロゲートコードポイント(タブ、改行などのスペース文字でもない)が削除されます。これを使用して、入力からすべての印刷不能文字を削除します。
<?php
$clean = preg_replace('/[^\PC\s]/u', '', $input);
\p{C}
の詳細については、 http://www.regular-expressions.info/unicode.html#category を参照してください。
PHPはPOSIXクラスをサポートしているため、[:cntrl:]
いくつかの派手なキャラクターの魔法の代わりに:
ereg_replace("[:cntrl:]", "", $pString);
編集:
5.3では、角括弧の追加ペアが必要になる場合があります。
ereg_replace("[[:cntrl:]]", "", $pString);
制御文字を保持しながら、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)。」)