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

Php 替换除换行符以外的所有不可打印字符,php,regex,laravel,Php,Regex,Laravel,我希望替换所有不可打印的字符,特别是文本中的表情符号,但希望保留换行符,如\n和\r 目前,我有这个用于转义不可打印字符,但它也转义\n和\r: preg_replace('/[[:^print:]]/', '', $value); 正则表达式“匹配某物,但不匹配其他物”的一般思想是首先匹配“其他物”,然后指示引擎跳过它 所以有点像 preg_replace('/[\r\n](*SKIP)(*FAIL)|[[:^print:]]/', '', $value); 这将匹配换行符,然后放弃匹配。

我希望替换所有不可打印的字符,特别是文本中的表情符号,但希望保留换行符,如
\n
\r

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

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

正则表达式“匹配某物,但不匹配其他物”的一般思想是首先匹配“其他物”,然后指示引擎跳过它

所以有点像

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

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

我认为这样做可以:

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

另一种采用反向逻辑实现相同目标的解决方案如下:

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

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

preg_replace('/[^\r\n[:print:][]/',''$value)
见:

$value=“一行\r\n第二行”;
echo preg_replace('/[^\r\n[:print:][]/','',''$value);
//=>单线
//第二行
[^\r\n[:print:][/code>模式匹配除可打印、CR和LF字符外的所有字符