验证用户提交的用户名字符串是否符合长度和字符限制

问题描述 投票:0回答:3

下面的正则表达式用于验证用户名。

  • 长度必须在 4-26 个字符之间

  • 至少以 2 个字母开头

  • 只能包含数字和一 下划线和一个点

到目前为止我已经有了这个,但不起作用。

$username = $_POST['username'];
if (!eregi("^([a-zA-Z][0-9_.]){4,26}$",$username)) {
    return false;
} else {
    echo "username ok";
}
php regex validation constraints password-strength
3个回答
40
投票

您可以使用正则表达式

/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD

<?php

$username=$_POST['username'];

if (!preg_match('/^(?=[a-z]{2})(?=.{4,26})(?=[^.]*\.?[^.]*$)(?=[^_]*_?[^_]*$)[\w.]+$/iD',
                $username))
{
 return false;
}
else
{
 echo "username ok";
}

?>
  • ^(?=[a-z]{2})
    确保字符串“以至少 2 个字母开头”。
  • (?=.{4,26})
    确保“长度必须在 4-26 个字符之间”。
  • (?=[^.]*\.?[^.]*$)
    确保后面的字符最多包含一个
    .
    直到结束。
  • 同样
    (?=[^_]*_?[^_]*$)
    确保最多有一个
    _
  • [\w.]+$
    提交比赛。它还确保仅涉及字母数字、
    _
    .

(注意:此正则表达式假定

hello_world
是有效的用户名。)


6
投票

您在一个正则表达式中要求很多,这可能是可能的,但这不是最好的方法,您想让用户知道为什么他们的用户名出错。

function checkUsername($username) {
    $username = trim($username);
    if (empty($username)) {
        return "username was left blank.";
    }elseif (strlen($username) < 4) {
        return "username was too short";
    }elseif (strlen($username) > 26) {
        return "username was too long";
    }elseif (!preg_match('~^[a-z]{2}~i', $username)) {
        return "username must start with two letters";
    }elseif (preg_match('~[^a-z0-9_.]+~i', $username)) {
        return "username contains invalid characters.";
    }elseif (substr_count($username, ".") > 1) {
        return "username may only contain one or less periods.";
    }elseif (substr_count($username, "_") > 1) {
        return "username may only contain one or less underscores.";
    }

    return true;
} 

然后检查你会做什么:

$validUsername = checkUsername($username);

if ($validusername !== true) {
     echo "An error occured: " . $validUsername;
}

这样用户就知道存在错误,并且可以更轻松地修复它,而不是对错误是什么视而不见。另外,您应该停止使用 ereg,它已被贬值,请改用 preg_match

注意 使用 !== 进行检查,这也会检查类型,因为它可以返回一个字符串(通过松散比较将返回 true)。仅供参考。


0
投票

你说的部分:

还有一个下划线和一个点

说实话,会让我远离正则表达式!

我会做类似的事情:

if(!eregi('^[a-zA-Z]{2}$', substr(0,2))) {
    // .... check for only 2 dots here later ....
}
© www.soinside.com 2019 - 2024. All rights reserved.