5

我只想允许字母数字字符和空格,所以我使用以下内容;

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

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

谢谢

4

2 回答 2

1

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

... YZ [ \ ] ^ _ ` ab ...

因此,不仅是下划线,还有您在上面看到的其他字符,如文档中所述:

范围以 ASCII 整理顺序运行。... 例如,[W-c]相当于[][\^_` wxyzabc]

为防止这种情况发生,您可以对字符类中的单个字符范围执行不区分大小写的匹配:

$name = preg_replace('/[^a-z0-9 ]/i', '', $str);
于 2013-06-11T23:59:29.360 回答
0

你的表达有误。最后的 Z 必须是大写字母。

$name = preg_replace('/[^a-zA-Z0-9 ]/', '', $str);
                              ^
于 2013-06-12T01:21:36.263 回答