UTF 8 String 删除除换行符以外的所有不可见字符

Posted

技术标签:

【中文标题】UTF 8 String 删除除换行符以外的所有不可见字符【英文标题】:UTF 8 String remove all invisible characters except newline 【发布时间】:2012-09-14 15:22:15 【问题描述】:

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

$string = preg_replace('/\pC+/u', '', $string);

这很好用,但是我如何改变它以删除除换行符之外的所有不可见字符?我尝试了一些使用 [^\n] 等的东西,但它不起作用。

感谢您的帮助!

编辑:换行符是 '\n'

【问题讨论】:

【参考方案1】:

在你这样做之前,将换行符(我想你正在使用类似 \n 的东西)替换为像 ++++++++ 这样的随机字符串(任何不会被你的正则表达式删除并且不会自然出现在你的字符串中的字符串首先),然后运行 ​​preg_replace,然后再次将 ++++++++ 替换为 \n

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

应该可以。如果您使用<br/> 而不是\n,只需使用nl2br 来保留换行符并替换<br/> 而不是\n

【讨论】:

\n 是的。你所描述的是我目前正在使用的,但我真的不认为它像正则表达式那样简洁(我认为,但不知道如何)【参考方案2】:

我使用否定断言,您可以使用除了断言匹配的字符类,所以:

$res = preg_replace('/(?!\n)\pC/', '', $input);

php 的正则表达式方言不支持字符类减法,否则将是另一种方法:[\pC-[\n]]。)

【讨论】:

我试过了,它不会删除换行符,也不会删除其他不可见字符(两种方法) @Stefan 这意味着不删除换行符:请参阅 Q 的标题“except newline”。 哦,对不起,我的意思是删除换行符。 @Stefan 刚刚测试过。创建了一个只有\n 行尾的文件(即Unix)。在它上面运行那个正则表达式:没有任何东西被替换。对于 Windows 文件(\r\n 行结尾),回车符被替换,但没有换行符。 (PHP 在输出上将单独的 \r\n 映射到 \r\n,因此 \n 可能会重新出现:这最初搞砸了我的测试。)【参考方案3】:

使用“双重否定”:

$string = preg_replace('/[^\PC\n]+/u', '', $string);

说明:

\PC[^\pC] 相同。 因此[^\PC]\pC 相同。 由于我们现在有一个否定字符类,我们可以从中减去其他字符,例如 \n

【讨论】:

以上是关于UTF 8 String 删除除换行符以外的所有不可见字符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式 python3 替换除空格和换行符旁边的数字以外的所有其他符号

使用批处理删除除一个以外的所有文件夹

Terraform - 删除除一个以外的所有资源

使用 OLE,从 OpenOffice/LibreOffice Calc 文档中删除除第一个以外的所有工作表,而不使用工作表名称

如何打印除一个以外的对象,而不删除任何内容(JavaScript)[重复]

正则表达式:元字符,量词