【问题标题】:PHP regex ampersand issuePHP正则表达式和符号问题
【发布时间】:2013-05-26 05:30:51
【问题描述】:

我使用以下正则表达式验证用户名(在注册表中输入文本),以确保用户名仅包含字母数字字符、点、破折号或下划线。

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

当我在文本字段中输入例如 % 或 # 或 @ 时,我会正确返回错误消息,即它不是有效的用户名,并且有效字符 (.-_) 也被接受,所以它似乎可以正常工作,直到当我键入 & 或 + 时,我可以使用 preg_match 键入之前已经排除的任何无效字符。

谁能告诉我为什么会这样,我该如何解决这个问题?

【问题讨论】:

  • 我试过你的代码,它对我来说很好。
  • $my_name 是如何设置的?即index.php?name=bob&x 将名称命名为bob。您可能需要为 5 个字符或更多字符的字符串添加最小长度,即 /^[a-zA-Z0-9\._\-]{5,}$/
  • 对不起,我忘了提到我在输入类型用户名字段的 keyup 事件上通过 ajax 帖子调用这个 php 正则表达式。我不知道这是否对您来说是一个额外的有价值的信息。
  • 为什么不完全排除&+,或者做一个preg_replace?这是一种选择。
  • 是的,这是一个选项,我已经尝试将 & 和 + 替换为 '' 但这是一个非常糟糕的用户体验。我无法将错误消息返回给我的用户做错了什么......以便修复它并继续。

标签: php regex preg-match


【解决方案1】:

问题出在其他地方。你的表达是正确的。我用PHP测试过。由于它与 '&' 字符一起发生,我的猜测是您的数据在发送之前未转换为 URL 安全字符。尝试在 JS 中使用 encodeURI() 函数。

【讨论】:

  • +1 也这么认为(见评论),但它没有解释 +(空格),因为它不在正则表达式中
  • 没用,我之前说过没有url请求,我用ajax post,我只是把用户名作为字符串传递,所以我认为不需要encodeURI(),请指正如果我错了。
  • 我解决了,但我仍然需要解释,如果你或其他人能给我,我将不胜感激。问题出在 ajax 发布数据上。我之前有这行来发布用户名,这工作了几个月:data: 'my_name='+ my_name 现在我将其更改为:data: { my_name: my_name} 并且它正在工作。谁能解释我为什么 & 和 + 在我使用这个时会导致这个问题:data: 'my_name='+ my_name 而不是 data: { my_name: my_name}
【解决方案2】:
if (!preg_match('/^[a-zA-Z0-9\.\_-]+$/',urldecode($my_name))) {  echo 'no_valid'; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2012-03-13
    • 2011-10-17
    • 2017-03-18
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多