我想只允许使用字母数字和空格,因此我使用以下代码: $name = preg_replace('/[^a-zA-z0-9 ]/', '', $str); 然而,这允许下划线 "_",而我不想要它。为什么会出现这种情况,我该如何解决? 谢谢。
字符类范围是指两个代码点之间的一系列字符。字符_包含在范围A-z中,您可以通过查看ASCII表来了解这一点: ... Y Z [ \ ] ^ _ ` a b ... 因此,不仅下划线被允许通过,还有您在上面看到的其他字符,如文档中所述: 范围按ASCII排序。例如,[W-c]等同于[][\^_`wxyzabc]。 要防止发生这种情况,您可以在字符类中使用单个字符范围执行大小写不敏感匹配: $name = preg_replace('/[^a-z0-9 ]/i', '', $str);