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

应该这样做。如果您使用<br/>而不是\n简单地使用nl2br来保留换行符并替换<br/>而不是\n

于 2012-09-22T11:55:23.787 回答