184

文字 0 ~ 31 と 127 を削除する必要があると思います。

これを効率的に行う関数またはコードはありますか?

4

17 に答える 17

150

ここでの他の回答の多くは、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を参照してください。

于 2011-11-17T17:50:00.223 に答える
18

すべてのソリューションは部分的に機能しますが、以下でさえすべてのケースをカバーしていない可能性があります。私の問題は、文字列を 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;
}

ここで少し説明したように、問題をさらに悪化させるのは、テーブル対サーバー対接続対コンテンツのレンダリングです。

于 2013-12-24T20:52:47.973 に答える
17

これはより簡単です:

$string = preg_replace( '/[^[:cntrl:]]/', '',$string);

于 2011-04-20T09:40:47.450 に答える
10

正規表現を使用して、保持したい文字以外のすべてを削除できます。

$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);

(^) A ~ Z または a ~ z の文字、0 ~ 9 の数字、スペース、アンダースコア、ハイフン、プラス、およびアンパサンド (^) 以外のものはすべて置き換えます (つまり、削除します)。

于 2009-07-24T10:50:59.253 に答える
6
preg_replace('/(?!\n)[\p{Cc}]/', '', $response);

これにより、すべての制御文字 ( http://uk.php.net/manual/en/regexp.reference.unicode.php )が削除され、\n改行文字が残ります。私の経験から、制御文字は印刷の問題を最も頻繁に引き起こすものです。

于 2013-03-01T11:06:52.233 に答える
0

「cedivad」は、スウェーデンの文字ÅÄÖの永続的な結果で問題を解決しました。

$text = preg_replace( '/[^\p{L}\s]/u', '', $text );

ありがとう!

于 2015-03-14T12:07:11.893 に答える