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

Gre*_*reg 6 php regex

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

 preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value)
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*ore 8

部分问题是您没有将目标视为UTF-8字符串; 你需要/u修改器.此外,在UTF-8中,任何非ASCII字符都由两个或多个字节表示,所有这些字节都在该范围内\x80..\xFF.试试这个:

preg_replace('/\p{Cc}+/u', '', $value)
Run Code Online (Sandbox Code Playgroud)

\p{Cc}是控制字符的Unicode属性,u导致正则表达式和目标字符串被视为UTF-8.


Wri*_*ken 7

您可以使用Unicode字符属性

preg_replace('/[^\p{L}\s]/u','',$value);
Run Code Online (Sandbox Code Playgroud)

(添加您想要通过的其他课程)

如果你想将unicode恢复为ascii,绝不是全面的,但有一些很好的翻译:

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno'
Run Code Online (Sandbox Code Playgroud)