10

次の正規表現を使用して、UTF-8 文字列からすべての非表示文字を削除しています。

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

これは正常に動作しますが、改行を除くすべての非表示文字を削除するように変更するにはどうすればよいですか? [^\n] などを使って色々試してみましたがだめでした。

助けてくれてありがとう!

編集:改行文字は「\ n」です

4

3 に答える 3

11

「二重否定」を使用します。

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

説明:

  • \P{C}と同じ[^\p{C}]です。
  • したがって[^\P{C}]、 と同じ\p{C}です。
  • 否定された文字クラスができたので、それから他の文字などを差し引くことができ\nます。
于 2012-09-22T16:12:51.407 に答える
2

否定的なアサーションを使用すると、アサーションが一致するものを除いて文字クラスを作成できます。

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

(PHP の正規表現の方言は、別のアプローチとなる文字クラスの減算をサポートしていません: [\p{C}-[\n]].)

于 2012-09-22T15:12:02.657 に答える
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

それはすべきです。単純にnl2brを使用する<br/>代わりに改行を保持し、代わりに置き換える場合\n<br/>\n

于 2012-09-22T11:55:23.787 に答える