2013-06-11 125 views
4

我想只允許字母數字字符和空格,所以我使用以下;preg_replace不會替換下劃線

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

但是,這是允許我不想要的下劃線「_」。爲什麼是這個,我該如何解決它?

由於

回答

1

character class範圍爲範圍內的兩個代碼點之間的字符。字符_包括在範圍A-z,你可以通過查看ASCII表中看出:

 
... Y Z [ \ ]^_ ` a b ... 

所以它不僅是一個的被允許通過的底線,但那些其他字符以上你看到的,如前所述在documentation

範圍在ASCII整理序列中操作。 ...例如,[W-c]相當於[][\^_`wxyzabc]

爲了防止這種情況發生,你可以在你的字符類執行與單個字符範圍不區分大小寫的匹配:

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

啊哈很好的回答。謝謝! – Ally

0

你在你的表達有誤。最後的Z必須是大寫。

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