使用PHP从UTF-8字符串中删除控制字符

19

所以我正在客户端(在输入后)删除控制字符(制表符、回车、换行符、\v和所有其他不可见字符),但由于不能信任客户端,我也必须在服务器上删除它们。

因此根据这个链接 http://www.utf8-chartable.de/

控制字符的范围是从x00到1F和从7F到9F。 因此,我的客户端(javascript)控制字符删除函数如下:

return s.replace(/[\x00-\x1F\x7F-\x9F]/g, "");

我的PHP(服务器端)控制字符移除函数是:

$s = preg_replace('/[\x00-\x1F\x7F-\x9F]/', '', $s);

现在这似乎会导致国际UTF8字符(如PHP中的ς(xCF x82))出现问题,仅限于PHP(因为x82位于第二个序列组内),JavaScript等价物不会创建任何问题。

现在我的问题是,我应该删除7F到9F之间的控制字符吗?据我所知,127到159(7F到9F)的这些序列显然可以成为有效的UTF-8字符串的一部分?

同时,也许我甚至不应该过滤00到31的控制字符,因为其中一些字符也可以出现在某些奇怪(日语?中文?)但有效的UTF-8字符中?


也许这可以帮助你:https://dev59.com/vWcs5IYBdhLWcg3w1XXZ 这是一个不同的正则表达式。 - Avatar
2个回答

16

看起来我只需要在正则表达式中加入u标志,它变成了:

$s = preg_replace('/[\x00-\x1F\x7F-\x9F]/u', '', $s);

0
我应该删除从7F到9F的控制字符吗?据我了解,从127到159(7F到9F)的这些序列显然可以是有效的UTF-8字符串的一部分?
除了\x7F之外,你不应该删除它们,因为它们在UTF-8中是低代理项。
也许我甚至不应该过滤掉00到31个控制字符,因为这些字符中的一些也可能出现在某些奇怪但有效的UTF-8字符(比如日语或中文字符)中?
这些控制字符在UTF-8中仍然是控制字符。它们的存在可能意味着一个Mojibake; 如果你想要纠正它,保留它们,否则就过滤掉它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接