替换除换行符之外的所有不可打印字符



我想替换所有不可打印的字符,尤其是文本中的表情符号,但希望保留换行符,如nr

我目前有这个用于转义不可打印的字符,但它也转义nr

preg_replace('/[[:^print:]]/', '', $value);

[:print:]是用于可打印字符的POSIX字符类。如果你在否定字符类中使用它,你可以进一步添加你不想与这个模式匹配的字符,即你可以使用

preg_replace('/[^rn[:print:]]/', '', $value)

请参阅PHP演示:

$value = "OnetlinernThe second line";
echo preg_replace('/[^rn[:print:]]/', '', $value);
// => Oneline
//    The second line

[^rn[:print:]]模式匹配除可打印字符、CR字符和LF字符之外的所有字符。

正则表达式的一般思想;匹配某个东西,但不匹配其他东西";是首先匹配";其他的东西";然后指示引擎跳过它。

所以。。。

preg_replace('/[rn](*SKIP)(*FAIL)|[[:^print:]]/', '', $value);

这将匹配换行符,然后放弃匹配。任何其他不可打印的字符仍由后半部分匹配,并替换为空字符串。

我认为这可以做到:

preg_replace('/(?![rn])[[:^print:]]/', '', $value);
  • (?![rn])-确保下一个字符不是r也不是n
  • [[:^print:]]-捕获不可打印的字符

实现相同目标的具有反向逻辑的替代解决方案如下:

preg_replace('/(?=[^rn])[[:^print:]]/', '', $value);

最新更新