在将值插入数据库之前,我正在使用以下正则表达式从用户输入中删除非打印控制字符。
preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value)
在utf-8字符串上使用它有问题吗?它似乎完全删除了所有非ascii字符。
答案 0 :(得分:8)
部分问题在于您没有将目标视为UTF-8字符串;你需要/u
修饰符。此外,在UTF-8中,任何非ASCII字符都由两个或更多字节表示,所有字节都在\x80..\xFF
范围内。试试这个:
preg_replace('/\p{Cc}+/u', '', $value)
\p{Cc}
是控制字符的Unicode属性,u
导致正则表达式和目标字符串都被视为UTF-8。
答案 1 :(得分:6)
您可以使用Unicode character properties
preg_replace('/[^\p{L}\s]/u','',$value);
(添加您想要通过的其他课程)
如果你想将unicode恢复为ascii,绝不是全面的,而是有一些不错的翻译:
echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno'