【问题标题】:Validate username as alphanumeric with underscores验证用户名是否为带下划线的字母数字
【发布时间】:2010-11-22 18:35:42
【问题描述】:

在我的注册页面上,我只需要验证用户名是否为字母数字,还可以使用可选的下划线。我想出了这个:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

这似乎工作正常,但我不是正则表达式专家!有没有人发现问题?

【问题讨论】:

  • 这将允许连字符,我认为句号也是如此
  • 我认为空白也可能对 \w 有效
  • 对于 PRE,\w 匹配“单词”字符(字母数字加“_”),根据 Perl 官方文档:perl.com/doc/manual/html/pod/perlre.html

标签: php regex preg-match


【解决方案1】:

实际使用的matched characters of \w depend on the locale

“单词”字符是任何字母或数字或下划线字符,即任何可以成为 Perl“单词”一部分的字符。字母和数字的定义由 PCRE 的字符表控制,并且如果发生特定于语言环境的匹配,可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于 128 的字符代码用于重音字母,这些字符由 \w 匹配。

因此,您最好明确指定要允许的字符:

/^[A-Za-z0-9_]+$/

这仅允许字母数字字符和下划线。

如果您只想允许下划线作为连接字符并希望强制用户名必须以字母字符开头:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/

【讨论】:

  • 为什么? \w 正好是字母数字字符和下划线。
  • 实际上,\w 是字母数字字符和下划线根据活动区域设置,因此根据情况,它可能会匹配'ü'或'ö'等字符。
  • 谢谢大家! Gumbo 的额外选项很有用,所以我会用它。干杯!
  • 好吧,我认为这个可以防止用户名最终变成_/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*[^_]$/。你觉得怎么样?
  • @Mahdi 这不是必需的,因为字符串必须以[A-Za-z](单个字符)或[A-Za-z0-9](来自[A-Za-z0-9]*,或者当包含_ 时,来自[A-Za-z0-9]+ )。与此相反,您的模式将允许除_ 之外的任何最后一个字符。
【解决方案2】:

试试

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}

【讨论】:

    【解决方案3】:

    我觉得不错。请注意,您对下划线的位置没有要求,因此“用户名_”和“___用户名”都可以通过。

    【讨论】:

    • 你能告诉我如何将限制设置为字母之间的一个下划线吗?
    【解决方案4】:

    您自己的解决方案非常好。

    preg_match 使用类似 Perl 的正则表达式,其中定义的字符类 \w 完全符合您的需要:

    \w - 匹配“单词”字符(字母数字加“_”)

    (source)

    【讨论】:

      【解决方案5】:

      这是一个自定义函数,通过将PHP ctype_alnum 与允许的字符数组结合使用来验证字符串:

      <?php
      
      $str = "";
      function validate_username($str) {
      
        // each array entry is an special char allowed
        // besides the ones from ctype_alnum
        $allowed = array(".", "-", "_");
      
        if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
          return $str;
        } else {
          $str = "Invalid Username";
          return $str;
        }
      }
      
      ?>
      

      【讨论】:

      • 一般来说,我喜欢尽可能避免使用正则表达式。对于这种验证,这似乎不太容易出错并且更容易理解(开发人员只需要知道 php,不需要知道 regex 语法)。该解决方案是 php 独有的,但这就是我正在寻找的。谢谢。
      【解决方案6】:

      我会采用gumbo的辅助正则表达式,只允许下划线作为连接,但在_之后添加一个+,这样用户就可以像“special__username”一样,只是一个小的调整。

      /^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

      【讨论】:

        猜你喜欢
        • 2020-11-01
        • 2014-01-31
        • 1970-01-01
        • 2010-09-10
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多