2013-05-30 51 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