【问题标题】:How to use `preg_match()` to match a username如何使用 `preg_match()` 匹配用户名
【发布时间】:2012-04-02 00:32:12
【问题描述】:

我正在尝试使用preg_match() 在 PHP 中验证用户名,但我似乎无法让它按照我想要的方式工作。我需要preg_match() 来:

  1. 只接受字符串开头和结尾的字母或数字
  2. 接受句点、破折号、下划线、字母、数字
  3. 长度必须在 5-20 个字符之间

preg_match('/^[a-zA-Z0-9]+[.-_]*[a-zA-Z0-9]{5,20}$/', $username)

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    将需求分解成更小的部分,您会发现它变得容易多了:

    • 第一个字符必须是 1 个字母或数字
    • 中间字符必须是句点、短划线下划线、字母或数字
    • 最后一个字符必须是字母或数字
    • 由于首尾段必须为 1 个字符,中间段必须为 3 到 18
    ~^[a-z0-9]{1}[a-z0-9._-]{3,18}[a-z0-9]{1}$~i
    

    【讨论】:

    • 你不需要{1},因为括号意味着匹配集合中的任何一个字符。此外,您需要将第二组括号中的点转义,否则它将明显匹配任何字符。
    • @Madbreaks 实际上,我认为在这种情况下,不必逃避这个时期。不过这样做肯定没有坏处。至于 {1},你说得对,它们是多余的,但我喜欢把它们放在一边,部分是出于习惯,部分是因为我喜欢我的正则表达式尽可能简单明了。
    • 感谢 Corbin,您对点的看法是正确的 - 感谢您指出我的错误!
    • @user1307016 嗯,字符串是什么?我只测试了“a”21 次,结果是假的。据我所知,重读模式,不可能匹配超过 20 个字符(根据需要)。您是否更改了正则表达式,如果是,更改为什么?
    • 糟糕。没关系。它就像一个魅力。忘记了 $ 来表示字符串的结尾。傻我。感谢您的帮助。
    【解决方案2】:
    if (preg_match('~^[0-9a-z][-_.0-9a-z]{3,18}[0-9a-z]$~i', $username) > 0)
    {
        // valid
    }
    

    【讨论】:

    • 你需要在第二组括号中转义那个点,否则它当然会匹配任何字符。
    【解决方案3】:

    如果正则表达式让您感到困惑,您始终可以将字符与正则表达式匹配,然后使用 strlen() 显式检查字符串的长度。

    $valid = preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/', $username)
             AND strlen($username) >= 5 AND strlen($username) <= 20;
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2018-08-25
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多