【发布时间】:2021-08-04 20:02:26
【问题描述】:
我想替换所有不可打印的字符,尤其是文本中的表情符号,但想保留换行符,例如 \n 和 \r
我目前有这个用于转义不可打印的字符,但它也可以转义 \n 和 \r:
preg_replace('/[[:^print:]]/', '', $value);
【问题讨论】:
我想替换所有不可打印的字符,尤其是文本中的表情符号,但想保留换行符,例如 \n 和 \r
我目前有这个用于转义不可打印的字符,但它也可以转义 \n 和 \r:
preg_replace('/[[:^print:]]/', '', $value);
【问题讨论】:
[:print:] 是用于可打印字符的 POSIX 字符类。如果您在否定字符类中使用它,您可以进一步添加您不想与此模式匹配的字符,即您可以使用
preg_replace('/[^\r\n[:print:]]/', '', $value)
见PHP demo:
$value = "One\tline\r\nThe second line";
echo preg_replace('/[^\r\n[:print:]]/', '', $value);
// => Oneline
// The second line
[^\r\n[:print:]] 模式匹配除可打印字符之外的所有字符,CR 和 LF 字符。
【讨论】:
我认为这样做可以:
preg_replace('/(?![\r\n])[[:^print:]]/', '', $value);
(?![\r\n]) - 确保下一个字符不是\r 也不是\n
[[:^print:]] - 捕获不可打印的字符实现相同目标的反向逻辑替代解决方案如下:
preg_replace('/(?=[^\r\n])[[:^print:]]/', '', $value);
【讨论】:
正则表达式“匹配某些内容,但不匹配其他内容”的一般想法是首先匹配“其他内容”,然后指示引擎跳过它。
比如……
preg_replace('/[\r\n](*SKIP)(*FAIL)|[[:^print:]]/', '', $value);
这匹配换行符,然后丢弃匹配。任何其他不可打印的字符仍然与后半部分匹配,并替换为空字符串。
【讨论】: