2013-05-30 55 views
2

我使用以下正則表達式來驗證用戶名(註冊表單中的輸入類型文本),以確保用戶名僅包含字母數字字符,點,短劃線或下劃線。PHP正則表達式&號問題

if (!preg_match('/^[a-zA-Z0-9\.\_-]+$/',$my_name)) { echo 'no_valid'; } 

當我在實例%或#文本字段或@ I型找回正確的,它不是一個有效的用戶名,也有效字符錯誤信息(-_)被接受,因此它似乎直到我輸入&或+時,我可以使用preg_match鍵入任何我已經排除的無效字符。

有人能告訴我爲什麼會發生這種情況,我該如何解決這個問題?

+0

我試過你的代碼,它適用於我。 –

+0

$ my_name是如何設置的?即'index.php?name = bob&x'命名爲'bob'。你可能需要添加一個最小長度,例如'/^[a-zA-Z0-9 \ ._ \ - ] {5,} $ /'用於5個字符或更多的字符串 – Waygood

+0

對不起,我忘了提及我稱之爲PHP正則表達式由輸入類型用戶名字段的鍵盤事件上的ajax帖子。我不知道這是否是一個額外的有價值的信息給你。 – AlexCode

回答

5

問題在其他地方。你的表情是正確的。我使用PHP進行了測試。由於它發生在'&'字符中,我猜測你的數據在發送之前不會轉換爲URL安全字符。嘗試在JS中使用encodeURI()函數。

+0

+1也認爲這是(見評論),但它沒有解釋+(空間),因爲它不是在正則表達式 – Waygood

+0

沒有工作,因爲我之前提到沒有url請求,我使用ajax後,我只是通過用戶名作爲字符串,所以我認爲不需要encodeURI(),請糾正我,如果我錯了。 – AlexCode

+0

我解決了它,但我仍然需要一個解釋,如果您或其他人可以給我,我會很感激。問題出在ajax發佈數據上。 我有這行之前發佈的用戶名,這個工作了幾個月: '數據:「MY_NAME =」 + my_name' 現在我把它改成: '數據:{MY_NAME:MY_NAME}' 和它的加工。任何人都可以解釋我爲什麼&和+導致這個問題,當我使用這個:'data:'my_name ='+ my_name'而不是'data:{my_name:my_name}' – AlexCode

-1
if (!preg_match('/^[a-zA-Z0-9\.\_-]+$/',urldecode($my_name))) { echo 'no_valid'; } 
+0

它不工作:( – AlexCode