【问题标题】:Make sure username is not a phone number确保用户名不是电话号码
【发布时间】:2011-07-28 19:34:33
【问题描述】:

我正在编写一个移动网站,我希望用户能够通过用户名或电话号码登录。我认为验证他们的回复的最简单方法是不允许他们使用电话号码作为用户名进行注册。

问题是我需要检查用户名字段的输入是否只是一个 10 位或 11 位数字。这就是我在正则表达式方面的缺乏经验对我不利的地方。我希望尝试类似的东西

    function do_reg($text, $regex)
{
    if (preg_match($regex, $text)) {
        return TRUE;
    } 
    else {
        return FALSE;
    }
}

     $username = $_POST['username'];
     if(do_reg($username, '[0-9]{10,11}')){
            die('cannot use a 10 or 11 digit number as a username');
     }

上述正则表达式匹配所有 10-11 位数字。我想也许我需要一种方式来说明用户输入字段中的唯一内容是否是 10-11 位数字,否则会释放蝴蝶和彩虹。

编辑:为了记录,我决定确保用户名不只是一个数字。认为这会更简单,我不喜欢让人们使用数字作为登录名的想法。

所以我最终选择了

if (!empty($username) && preg_match('/^\d+$/', $username )) {
              die('username cannot be a number');
}

感谢大家的帮助。

【问题讨论】:

  • 您的do_reg 函数没有理由存在。没用 - 使用 preg_match instad。

标签: php regex


【解决方案1】:

您几乎是正确的,除了 PHP 中的 PCRE 需要分隔符,并且可能需要一些锚来确保该字段仅包含数字。

 if(do_reg($username, '/^\d{10,11}$/')){
//                     ^^         ^^

并且可能使用\d 而不是[0-9]

(顺便说一句,你应该直接打电话给preg_match

if (!preg_match('/^\d{10,11}$/', $username)) {
   release('bufferflies', 'rainbows');
}

【讨论】:

  • 我建议始终使用[0-9],而不是\d,原因如下:stackoverflow.com/questions/890686/…
  • @Matt: 取决于OP是否愿意接受5556789作为电话号码:)
  • \d[0-9] 相比有什么速度优势吗?我倾向于毫无理由地互换使用它们。
【解决方案2】:

您需要锚定正则表达式以匹配整个字符串:^[0-9]{10,11}$

^ 匹配字符串的开头; $ 匹配结尾。

【讨论】:

    【解决方案3】:

    将用户名限制为 10 个字符,并要求用户名以字母开头。如果要求用户输入至少 1 个字母字符(因为电话号码不能以 0/o 或 1/l 开头),用户如何将 10 位数的电话号码作为用户名? (为了安全起见,我至少需要 3 个 alpha 字符)。

    当您的应用变得更大时,您可以允许更长的用户名并考虑以下一些问题:

    如果您只测试用户名,请勿使用 ^ 或 $ 符号:if(do_reg($username, '/^\d{10,11}$/')){

    我这么说的原因是任何人都可以通过在他们的用户名 a1235551212 中添加一个字母来解决这个问题 而是使用这个: if(do_reg($username, '/\d{10,11}/')){ 因为那会标记 a1235551212d

    另外,重要的是,请记住,所有这些正则表达式都只是检查数字,没有什么可以阻止用户执行以下操作:ltwo3for5six7890。当然,除非您限制用户名大小。

    【讨论】:

    • 我不在乎他们是否使用数字作为用户名 persay。更多的是我不希望用户名与电话号码匹配的可能性。我正在检查唯一的电话号码,但是当他们登录时,我希望能够说 `if ($login == $digits) {//use phone} else{ //use username} 但是,加 1 表示至少需要一个字母字符我喜欢这个主意:)
    • 加一与用户名的最大长度 10 结合使用。我仍然推荐至少 3 个 alpha 字符,并且用户名以 char 开头。如果您只使用 1 个 alpha,那么用户可以执行 123555l2l2(注意 L)。我在上一个示例中试图理解的是 ltwo3for5six7890 实际上是一个伪装的电话号码。
    • 是的,问题不在于电话号码。甚至看起来像一个电话号码。我将我的电话号码以 11 位数字存储在我的数据库中。因此,当他们登录时,我只需要确保用户名或电话号码与他们在登录时输入的内容相匹配。因此,如果 ltwo3for5six7890 匹配他们的用户名,那很好。我只是不希望一个用户使用15555555555 作为他们的用户名,而另一个用户使用15555555555 作为他们的电话号码,因为这样我的查询将返回两个结果。
    【解决方案4】:

    你应该在正则表达式中包含字符串的开始和结束

    ^[0-9]{10,11}$
    

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 2023-04-07
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多