Preg_replace不替换下划线


preg_replace not replacing underscore

我想只允许alpha数字字符和空格,所以我使用下面的;

$name = preg_replace('/[^a-zA-z0-9 ]/', '', $str);

然而,这允许下划线"_",这是我不想要的。为什么会这样,我该如何解决?

谢谢

字符类范围用于两个代码点之间的字符范围。字符_包含在范围A-z中,您可以通过查看ASCII表看到这一点:

<>之前…Y Z ['] a b…之前

所以不仅仅是下划线被允许通过,还有你在上面看到的其他字符,如文档中所述:

range以ASCII排序顺序. ...进行操作例如,[W-c]等于[]['^_ ' wxyzabc]

为了防止这种情况的发生,你可以在你的字符类中执行一个不区分大小写的匹配:

$name = preg_replace('/[^a-z0-9 ]/i', '', $str);

你的表达有误。最后一个Z必须大写

$name = preg_replace('/[^a-zA-Z0-9 ]/', '', $str);
                              ^