文字 0 ~ 31 と 127 を削除する必要があると思います。
これを効率的に行う関数またはコードはありますか?
ここでの他の回答の多くは、Unicode 文字を考慮していません (例: öäüßйȝîûηыეமிᚉ⠛ )。この場合、以下を使用できます。
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);
\x80-\x9F
この範囲(7 ビット ASCII 範囲の文字のすぐ上) には、技術的には制御文字である奇妙なクラスの文字がありますが、長い間、印刷可能な文字として誤用されてきました。これらに問題がない場合は、次を使用できます。
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $string);
ライン フィード、キャリッジ リターン、タブ、非改行スペース、およびソフト ハイフンも削除する場合は、次を使用できます。
$string = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $string);
上記の例では、一重引用符を使用する必要があることに注意してください。
基本的な印刷可能な ASCII 文字 (上記の例の文字はすべて削除されます) 以外のすべてを削除したい場合は、次を使用できます。
$string = preg_replace( '/[^[:print:]]/', '',$string);
参照については、http://www.fileformat.info/info/charset/UTF-8/list.htmを参照してください。
すべてのソリューションは部分的に機能しますが、以下でさえすべてのケースをカバーしていない可能性があります。私の問題は、文字列を utf8 mysql テーブルに挿入しようとしたことにありました。文字列 (およびそのバイト) はすべて utf8 に準拠していましたが、いくつかの不適切なシーケンスがありました。それらのほとんどはコントロールまたはフォーマットだったと思います。
function clean_string($string) {
$s = trim($string);
$s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters
// this is some bad utf-8 byte sequence that makes mysql complain - control and formatting i think
$s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);
$s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space
return $s;
}
ここで少し説明したように、問題をさらに悪化させるのは、テーブル対サーバー対接続対コンテンツのレンダリングです。
これはより簡単です:
$string = preg_replace( '/[^[:cntrl:]]/', '',$string);
正規表現を使用して、保持したい文字以外のすべてを削除できます。
$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);
(^) A ~ Z または a ~ z の文字、0 ~ 9 の数字、スペース、アンダースコア、ハイフン、プラス、およびアンパサンド (^) 以外のものはすべて置き換えます (つまり、削除します)。
preg_replace('/(?!\n)[\p{Cc}]/', '', $response);
これにより、すべての制御文字 ( http://uk.php.net/manual/en/regexp.reference.unicode.php )が削除され、\n
改行文字が残ります。私の経験から、制御文字は印刷の問題を最も頻繁に引き起こすものです。
「cedivad」は、スウェーデンの文字ÅÄÖの永続的な結果で問題を解決しました。
$text = preg_replace( '/[^\p{L}\s]/u', '', $text );
ありがとう!