preg_replace不替换下划线

All*_*lly 5 php regex preg-replace

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

$name = preg_replace('/[^a-zA-z0-9 ]/', '', $str);
Run Code Online (Sandbox Code Playgroud)

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

谢谢

小智 1

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

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

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

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

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

$name = preg_replace('/[^a-z0-9 ]/i', '', $str);
Run Code Online (Sandbox Code Playgroud)