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字符外的所有字符