除了换行符外,删除所有不可见字符的UTF-8字符串

10

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

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

这个代码可以正常工作,但我该如何修改它以除去所有不可见字符,但保留换行符?我尝试使用 [^\n] 等方法,但它不起作用。

谢谢你的帮助!

编辑:换行符为 '\n'

这段代码可以正常运行,但如何修改以删除所有不可见字符,保留换行符?我尝试过使用 [^\n] 等方法,但均不生效。

感谢协助!

编辑:换行符为 '\n'

3个回答

13
使用“双重否定”:
$string = preg_replace('/[^\P{C}\n]+/u', '', $string);

解释:

  • \P{C} 等同于 [^\p{C}]
  • 因此,[^\P{C}]\p{C} 相同。
  • 由于我们现在有了一个取反的字符类,我们可以从中排除其他字符,例如 \n

2

使用否定断言可以排除字符类中与断言匹配的内容,因此:

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

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

我尝试了,它没有去除换行符,也没有去除其他不可见的字符(两种方法都试过了) - Stefan
@Stefan 这意味着不要删除换行符:请参阅问题标题中的“除了换行符”。 - Richard
哦,对不起,我的意思是它确实会删除换行符。 - Stefan
@Stefan 刚刚测试了一下。创建了一个只有\n行结尾的文件(即Unix格式)。对其运行了正则表达式:没有替换任何内容。使用Windows格式的文件(\r\n行结尾),回车符被替换了,但是换行符没有被替换。(PHP将单独的\r\n映射为输出的\r\n,因此\n可能会重新出现:这最初搞乱了我的测试。) - Richard

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


这就是我目前正在使用的内容,但我并不认为它很简洁,因为正则表达式可以完成它(我认为,但不知道如何实现)。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接