字符类范围是两个代码点之间的字符范围。该字符_
包含在 rangeA-z
中,您可以通过查看 ASCII 表看到这一点:
... YZ [ \ ] ^ _ ` ab ...
因此,不仅是下划线,还有您在上面看到的其他字符,如文档中所述:
范围以 ASCII 整理顺序运行。... 例如,[W-c]
相当于[][\^_
` wxyzabc]
。
为防止这种情况发生,您可以对字符类中的单个字符范围执行不区分大小写的匹配:
$name = preg_replace('/[^a-z0-9 ]/i', '', $str);