我想替换所有不可打印的字符,尤其是文本中的表情符号,但希望保留换行符,如n
和r
我目前有这个用于转义不可打印的字符,但它也转义n
和r
:
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);