确保用户名不是电话号码

时间:2011-04-03 21:56:46

标签: php regex

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

问题是我需要检查用户名字段的输入是否只是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');
}

感谢所有人的帮助。

4 个答案:

答案 0 :(得分:7)

你几乎是正确的,除了PHP中的PCRE需要分隔符,并且可能还有一些锚点以确保该字段仅由数字组成。

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

可能使用\d代替[0-9]

(顺便说一句,你应该直接致电preg_match

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

将用户名限制为仅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。除非你限制用户名大小。

答案 3 :(得分:0)

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

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