2012-09-22 26 views
7
私はUTF-8文字列からすべての目に見えない文字を削除するには、次の正規表現を使用してい

以外のすべての目に見えない文字を削除します。UTF-8文字列は改行

$string = preg_replace('/\p{C}+/u', '', $string); 

これは正常に動作しますが、私はそのようにそれをどのように変えますか改行以外のすべての見えない文字を削除しますか?私は[^ \ n]などを使っていくつかのものを試しましたが、うまくいきません。

ありがとうございます!

編集:改行文字は、あなたがそれを行う前に、「\ n」の

答えて

5

"double negation"を使用してください:

$string = preg_replace('/[^\P{C}\n]+/u', '', $string); 

説明:

  • \P{C}[^\p{C}]と同じです。
  • したがって、[^\P{C}]\p{C}と同じです。
  • ネゲートされた文字クラスがあるので、\nのような他の文字を取り除くことができます。
+0

ありがとう!これは完璧に動作しているようです:) – Stefan

0

で、++++++++のようなランダムな文字列を改行に(私はあなたが\nのようなものを使用していると仮定)(あなたによって除去されることはありません任意の文字列を置換します正規表現は自然にあなたの文字列には現れません)、preg_replaceを実行してから++++++++\nに置き換えてください。

$string=str_replace('\n','++++++++',$string); //Replace \n 
$string=preg_replace('/\p{C}+/u', '', $string); //Use your regexp 
$string=str_replace('++++++++','\n',$string); //Insert \n again 

そうすべきです。あなたの代わりに\n<br/>を使用している場合、アサーションが一致するものを除き、文字クラスにすることができ、負のアサーションを使用して私の単純ので、改行を維持するためにnl2brを使用して、代わりに\n

+0

\ nです。あなたが記述したものは、私がこの時点で使用しているものですが、私は正規表現がそれを行うことができるようにきちんとしているとは思っていません(私は思っていますが、どういうわけか分かりません) – Stefan

2

<br/>を置き換える:

$res = preg_replace('/(?!\n)\p{C}/', '', $input); 

(PHPの正規表現の方言は、文字クラスの減算をサポートしていません。それ以外の場合は別の方法である:[\p{C}-[\n]]

+0

私は、他の見えない文字も削除しない(どちらの方法も) – Stefan

+0

@Stefan改行を削除しないことを意味します。Q "* except * newline"のタイトルを参照してください。 – Richard

+0

ああ申し訳ありませんが、私は改行を削除することを意味します。 – Stefan