去除非打印字符的preg_replace似乎也删除了所有外来字符

时间:2010-07-20 23:13:09

标签: php regex

在将值插入数据库之前,我正在使用以下正则表达式从用户输入中删除非打印控制字符。

 preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value)

在utf-8字符串上使用它有问题吗?它似乎完全删除了所有非ascii字符。

2 个答案:

答案 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'