UTF-8字符串中删除除换行符所有不可见的字符(UTF 8 String remove all in

2019-07-31 19:42发布

我使用下面的正则表达式从一个UTF-8字符串中删除所有不可见的字符:

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

这工作得很好,但我要如何改变它,这样它会删除所有不可见的字符EXCEPT换行符? 我试着用[^ \ n]等一些东西,但它不工作。

感谢您的帮助了!

编辑:换行符是“\ n”

Answer 1:

使用“双重否定”:

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

说明:

  • \P{C}是相同的[^\p{C}]
  • 因此[^\P{C}]是相同的\p{C}
  • 因为我们现在有一个否定的字符类,我们可以等。减去的字符,如\n从它。


Answer 2:

我使用负断言你除了可以断言匹配什么,这样一个字符类:

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

(正则表达式的PHP的方言不支持字符类减法这会,否则,是另一种方法: [\p{C}-[\n]] )。



Answer 3:

在你做它,取代换行符(我假设你正在使用类似\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



文章来源: UTF 8 String remove all invisible characters except newline