首页 > 解决方案 > 摆脱不良字符,但保留所有语言的所有字符

问题描述

我正在尝试清理 PHP 中的播客描述,以消除不可见、表情符号、随机字节等不良字符,以写入 MySQL。问题是播客描述是所有语言的,并且包含我需要保留在每个可以想象的字符集中的合法文本,可能包括一些难以想象的字符。我看不到创建字符白名单或字符黑名单的方法。有什么建议么?

标签: php

解决方案


如果您可以确保您的字符串是 UTF-8(例如使用utf8_encode()或),则可以在表达式iconv()中使用字符类别黑/白名单。

首先,我将删除\p{C}("other") 和\p{S}("symbol")类别中的所有字符。那应该抓住大部分的杂物。

$description = "Some random string, with a  emoji";
$filtered = preg_replace('/[\p{C}\p{S}]/u', '', $description);
// string(33) "Some random string, with a  emoji"

请注意,您需要使用u修饰符。

这应该是一个很好的起点,但它可能过于严格。它可能会从描述中删除太多内容。例如,货币符号在某些经济播客描述中可能是有效的,而数学符号在基于数学的播客描述中可能是绝对必要的。

如有必要,您可以从中调整它以仅替换特定的子类别。\p{S}因此,您可能只想删除\p{Sk}(“修饰符”)和\p{So}(“其他符号”)类别中的字符,而不是删除整个类别。或者您可能想要包含其他类别,例如\p{Pc}(“连接符标点符号”)。


推荐阅读